實(shí)驗(yàn)-OpenGL幾何變換_第1頁(yè)
實(shí)驗(yàn)-OpenGL幾何變換_第2頁(yè)
實(shí)驗(yàn)-OpenGL幾何變換_第3頁(yè)
實(shí)驗(yàn)-OpenGL幾何變換_第4頁(yè)
實(shí)驗(yàn)-OpenGL幾何變換_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、精品文檔實(shí)驗(yàn)OpenGL幾何變換1 .實(shí)驗(yàn)?zāi)康模豪斫庹莆找粋€(gè)OpenGL程序平移、旋轉(zhuǎn)、縮放變換的方法。2 .實(shí)驗(yàn)內(nèi)容:(1)閱讀實(shí)驗(yàn)原理,運(yùn)行示范實(shí)驗(yàn)代碼,掌握OpenGL程序平移、旋轉(zhuǎn)、縮放變換的方法;(2)根據(jù)示范代碼,嘗試完成實(shí)驗(yàn)作業(yè);3 .實(shí)驗(yàn)原理:(1) OpenGLT的幾何變換在OpenGL的核心庫(kù)中,每一種幾何變換都有一個(gè)獨(dú)立的函數(shù),所有變換都在三維空間中定義。平移矩陣構(gòu)造函數(shù)為glTranslate(tx, ty, tz),作用是把當(dāng)前矩陣和一個(gè)表示移動(dòng)物體的矩陣相乘。tx, ty , tz指定這個(gè)移動(dòng)物體的矩陣,它們可以是任意的實(shí)數(shù)值,后綴為 f (單精度浮點(diǎn)float )

2、或d (雙 精度浮點(diǎn)double),對(duì)于二維應(yīng)用來(lái)說(shuō),tz=0.0 。旋轉(zhuǎn)矩陣構(gòu)造函數(shù)為 glRotate(theta, vx, vy, vz),作用是把當(dāng)前矩陣和一個(gè)表示旋轉(zhuǎn)物體的矩陣相乘。theta, vx, vy, vz指定這個(gè)旋轉(zhuǎn)物體的矩陣,物體將繞著(0,0,0)到(x,y,z)的直線以逆時(shí)針旋轉(zhuǎn),參數(shù)theta表示旋轉(zhuǎn)的角度。向量 v=(vx, vy , vz)的分量可以是任意的實(shí)數(shù)值,該向量用于定義通過(guò)坐標(biāo) 原點(diǎn)的旋轉(zhuǎn)軸的方向,后綴為f (單精度浮點(diǎn)float )或(雙精度浮點(diǎn)double ),對(duì)于二維旋轉(zhuǎn)來(lái)說(shuō),vx=0.0 , vy=0.0 , vz=1.0。縮放矩陣構(gòu)造函數(shù)為

3、 glScale(sx, sy, sz),作用是把當(dāng)前矩陣和一個(gè)表示縮放物體的矩陣相乘。sx,sy, sz指定這個(gè)縮放物體的矩陣,分別表示在 x,y,z方向上的縮放比例,它們可以是任意的實(shí)數(shù)值,當(dāng)縮 放參數(shù)為負(fù)值時(shí),該函數(shù)為反射矩陣,縮放相對(duì)于原點(diǎn)進(jìn)行,后綴為 f (單精度浮點(diǎn)float )或d (雙精度 浮點(diǎn) double)。注意這里都是說(shuō) 把當(dāng)前矩陣和一個(gè)表示移動(dòng)旋轉(zhuǎn),縮放砌體的矩陣相乘”,而不是直接說(shuō) 這個(gè)函數(shù)就是旋轉(zhuǎn)”或者 這個(gè)函數(shù)就是移動(dòng)”,這是有原因的,馬上就會(huì)講到。假設(shè)當(dāng)前矩陣為單位矩陣,然后先乘以一個(gè)表示旋轉(zhuǎn)的矩陣R,再乘以一個(gè)表示移動(dòng)的矩陣 T,最后得到的矩陣再乘上每一個(gè)頂點(diǎn)

4、的坐標(biāo)矩陣v。那么,經(jīng)過(guò)變換得到的頂點(diǎn)坐標(biāo)就是(RT)v) o由于矩陣乘法滿足結(jié)合率,(RT)v) = R(Tv),換句話說(shuō),實(shí)際上是先進(jìn)行移動(dòng),然后進(jìn)行旋轉(zhuǎn)。即:實(shí)際變換的順序與代碼中寫的順序是相反的。由于先移動(dòng)后旋轉(zhuǎn)”和 先旋轉(zhuǎn)后移動(dòng)”得到的結(jié)果很可能不同,初學(xué)的時(shí)候需要特別注意這一點(diǎn)。(2) OpenGLT的各種變換簡(jiǎn)介我們生活在一個(gè)三維的世界 如果要觀察一個(gè)物體,我們可以:(3) 不同的位置去觀察它(人運(yùn)動(dòng),選定某個(gè)位置去看)。(視圖變換)2、移動(dòng)或者旋轉(zhuǎn)它,當(dāng)然了,如果它只是計(jì)算機(jī)里面的物體,我們還可以放大或縮小它(物體運(yùn)動(dòng),讓人 看它的不同部分)。(模型變換)3、如果把物體畫下來(lái),

5、我們可以選擇:是否需要一種近大遠(yuǎn)小”的透視效果。另外,我們可能只希望看到物體的一部分,而不是全部(指定看的范圍)。(投影變換)4、我們可能希望把整個(gè)看到的圖形畫下來(lái),但它只占據(jù)紙張的一部分,而不是全部(指定在顯示器窗口的那個(gè)位置顯示)。(視口變換)這些,都可以在OpenGL中實(shí)現(xiàn)。從相對(duì)移動(dòng)”的觀點(diǎn)來(lái)看,改變觀察點(diǎn)的位置與方向和改變物體本身的位置與方向具有等效性。在OpenGL中,實(shí)現(xiàn)這兩種功能甚至使用的是同樣的函數(shù)。由于模型和視圖的變換都通過(guò)矩陣運(yùn)算來(lái)實(shí)現(xiàn),在進(jìn)行變換前,應(yīng)先設(shè)置當(dāng)前操作的矩陣為模型視圖矩陣設(shè)置的方法是以 GL_MODELVIEW/參數(shù)調(diào)用glMatrixMode函數(shù),像這樣

6、:glMatrixMode(GL_MODELVIEW);該語(yǔ)句指定一個(gè)4 X4的建模矩陣作為當(dāng)前矩陣。通常,我們需要在進(jìn)行變換前把當(dāng)前矩陣設(shè)置為單位矩陣。把當(dāng)前矩陣設(shè)置為單位矩陣的函數(shù)為:glLoadIdentity();我們?cè)谶M(jìn)行矩陣操作時(shí),有可能需要先保存某個(gè)矩陣,過(guò)一段時(shí)間再恢復(fù)它。當(dāng)我們需要保存時(shí),調(diào)用glPushMatrix ()函數(shù),它相當(dāng)于把當(dāng)前矩陣壓入堆棧。當(dāng)需要恢復(fù)最近一次的保存時(shí),調(diào)用 glPopMatrix ()函數(shù),它相當(dāng)于從堆棧棧頂彈出一個(gè)矩陣為當(dāng)前矩陣。OpenGL定堆棧的容量至少可以容納 32個(gè)矩陣,某些OpenGL實(shí)現(xiàn)中,堆棧的容量實(shí)際上超過(guò)了32個(gè)。因此不必過(guò)

7、于擔(dān)心矩陣的容量問(wèn)題。通常,用這種先保存后恢復(fù)的措施,比先變換再逆變換要更方便,更快速。注意:模型視圖矩陣和投影矩陣都有相應(yīng)的堆棧。使用glMatrixMode來(lái)指定當(dāng)前操作的究竟是模型視圖矩陣還是投影矩陣。4 .示范代碼:(1)、Translate 示例11歡在下載void init (void) (glClearColor (1.0, 1.0r 1.0,0.0);glMatrixMode (GL_PROJECTION);gluOfthoZD C-5.0f 5,0f -5A 5.0);力設(shè)置礪的旗是X:5.0%i0, Y:-5,05,0 glWatrixMode (GL_MODELVIEW)

8、;void drawsauare(void) /繪制中心在原點(diǎn),邊長(zhǎng)為2的正方形glBegin CGL_POLYGON); /原點(diǎn)中睡蕊枝期針的jVertexNf (口時(shí)門,叫;“卻點(diǎn)jVertuxZf (L.QfLOQ;/佑下點(diǎn)glvertex2f (1.0ff LOQ陸上點(diǎn)glUertex2f C-LOfrLOQi,住上點(diǎn)glEnd();void my Drawl (void) glC3(GLjCOLOR_BUFFER_BIT); 礴空 9193由的向勺。;/陽(yáng)當(dāng)前矩陣模為單位矩陣 glCo or3f (1.0f 0.Q 0.0);drawSquareO: /在原點(diǎn)處繪制肪長(zhǎng)為2紅色正月立

9、 glTranslateffi.O3,O,O); “向右移動(dòng)?jì)任?歸止搬M單位 glColorlf C0.0r 1.Cr 0.0);drawSquareQ- 繪制逡長(zhǎng)為,邑正方形 小丁向口5店恒汽0.0二3,0/01);H向F移動(dòng)3單位glColorJf (0.0T Q感 1.0);drawSqusreO; 繪制邊長(zhǎng)為2藍(lán)色正方形 glAush ();void rriyDraw2 (v*id)glClear (GL_COLOR_BUFFER_BtT); /清空 glLoadldergQ茄將當(dāng)前拒陣殳為單位矩陣ecgmf 口,0,。.2 o.o);drawsquare); 在原點(diǎn)處箍加長(zhǎng)為2紅色

10、正方flggl Push Matrix ();丁川1|就研(2。3.。#*。);向右移動(dòng)2單位,向上移動(dòng)3單位glColorSf (0.0r LU,0.0);drawSqudreC); 繪制姊為遍色正方形gliPcpMatrix(;6一曰門與山國(guó)耳2烏0口6。);再向右移動(dòng)彈位glColor3r (0.0, 0,0r 1.0);drawSiuar&O;“繪制邊長(zhǎng)為2藍(lán)色正方形glFlush ();)void main (irtt arc, ihar* arv),utlnit (ftangc,己即);glutlmtDisplayMode (GLUTES!NGLE | GLUT_RGS);gl u

11、tlnitWi nriowPosition (。0);gI lt tin itWi ndciwSi ze :60。/6C0);glutCreateWindow fTransl就匡散示例。;init();glutDisRayFjn匚(myDra/d);gllitMainLoop ();生成圖形:注意理解:myDrawl ()和myDraw2()生成的圖形完全相同,為什么?(2)、Rotate 示例止include void init (void) (glClearColor CIA 1-0* 1-0 0.0);gIMatrixMode (GL_PROJECnON):gluOrtho2D (-5.

12、0, 5.O, -5.O, 5.0); 設(shè)置顯示的的凰是乂::-5.05.0 glMatrixMode fGL_MDDELVIEW);sE drawEqu甘伯Jeid) 繪制申心在原點(diǎn),邊長(zhǎng)為期正方取(glBagm (GL_POLYGCN); 點(diǎn)豐靛慧按畫寸計(jì)方向glVertQx2fglVertexlf (LMT 如;*6T點(diǎn)glvertex2f (l-0t 1.0f);/6j5gMrtex2f (-L a L的;ME 上點(diǎn) HEW ();void my Drawl (void)(glQew (GL_COLQR_BUFF樂(lè)孚IT)席空 QlLsdldsntitY。潴當(dāng)前矩陳設(shè)為單位拒除 glC

13、olor3f (IQ 0A 0.0);d冏”在原點(diǎn)處治制電長(zhǎng)為2紅色正方形glTranslatef。.。月2月E); 向右移動(dòng)2單位,向上移動(dòng)3單位9收比式才華口,0&???,。);川1佛寸針球3。角度glColorSf (C.0,1。0.0);dnawSquareD; 繪制邊轉(zhuǎn)為編色正方形glLoadldentityO; /南當(dāng)前鄴鍍?yōu)閱挝煌緂lTranslateft-Z.0,-3.0.0); /府左移動(dòng)躥位.向下移幼13單位31寸寸(4010.口10.口.口);川理日腳漆轉(zhuǎn)30鬲度glColor3f (0.0T 0.0f 1.0);d陷wEqumrH); 繪制邊長(zhǎng)力2藍(lán)色正方形 glFlu

14、sh ();void rriYDraw2 (void)(glClear (GL_COLORl_BUFFER_BID;,清空皿nW當(dāng)?shù)衲响傥痪鼗辡lCdorSf 口.0, 0.0, 0.0);de判Square。;在原的繪制邊長(zhǎng)為2紅邑正方形gIPushMatrixO;把當(dāng)前矩陣壓入推槎glTranslatef(2.0f3.0r0.Q);“向右移動(dòng)2單位口向上移動(dòng)3單位glRogtef。#.。,。.。);/川陽(yáng)寸針觸30角度glColor3f (0. 1。0.0);dm例Square。;”徐制邊長(zhǎng)為葡色正方形gIP??贛atrix。;“狽堆棧棧頂鎖一快降為當(dāng)前抵??诮颭口3|就中,。,3口刀,

15、。;/胸左移動(dòng)理位1所移動(dòng)理位 川網(wǎng)就中(7。,???2工0);,便口撒旋轉(zhuǎn)3。角度glColorjf (Q,0f 0,0, 1.0);dQ叫Squ打式);給td魅為2藍(lán)色正方形glFlusii ():void main (int argc. char* argv)gluUnit (ftargq argv);glutlnitDieplayModfi (GLUT_SINGLE | GLUT_RGB);qIutlnitWindowPcsiticn (0r 0);glutlnitWindOLvSize 1800600);gutCr&ateWindc*w依13座微示侑);iniC();glutDisp

16、layFunc (myDrawl;glutMainLoop ();生成圖形:注意理解:myDrawl ()和myDraw2()生成的圖形完全相同,為什么?、Scale示例精品文檔士 ncludL/glut.hvoid init (void) (glCn式。心(1。10 IQ QQ)iOlMatrixMode (GL_PROJECT1ONJ;gluOrttic2D (-5,0; 5。-50 5.0);遺是M;60z5 Y:5O5,。glMtrixMode (GL_MODELVIEW);void dQwSqumre穆Did)”鋁制中心在原點(diǎn),邊長(zhǎng)為2的正方形(QlBeginGL_POLYGON;/

17、順點(diǎn)才靛耨按前寸針加glX/ert啟x2f (-1.肝廠1.0優(yōu)卻點(diǎn)glVertex2fC1.0fp-L00;/*TQlVertexZf (l.Of, LOf;/話上點(diǎn)glVertex2f QL%L0f);S 上點(diǎn)glEhd ();void myDrawl (voidjglClear (GU_COLOR_8UFFER_5IT); /精空Lsdld即.當(dāng)槌銀為單位矩陣QlCdor3f (l.Qf OhOj 0.0);draw5quare1:“在原點(diǎn)處卷制成長(zhǎng)為Z紅色正方形glTraasImt所(,口尸山內(nèi),0); 向右移動(dòng)2單位,向上移動(dòng)3單位glScalf( 1,0,1.54.0); X和Z方

18、向保持不變f昉向放大為原蝴,5倍glColor3f (Q.0,1.0f 0.0);dewGquv芭。;解1姊為遍SE方形以1_。拓1北向曾口儲(chǔ)當(dāng)前拒住設(shè)為單位拒附QlTranslatef(-2.03.0,0.0); /向左視力彈位,向下移動(dòng)3單位0醫(yī)8(0.5/,5,1,0);2方向保持不變,歷幽小為原來(lái)的口同音,V方向湫為原來(lái)的L5倍 glColor3f fO.O, 0.0; 1.0);dQW,qUKe();”繪制解為締色I(xiàn)方形fllFlusti ();void myDraw2 (void)glOear (GL_COLOR_BUFFER_BITJ: /緇空glLoadldentiM): /除

19、當(dāng)前矩陣設(shè)為單位拒睥glColor3f L.0T D.0f 0.0);drawSquareO;在原點(diǎn)處繪制邊長(zhǎng)為2紅色正方鳧gIPushMatrixti; 把當(dāng)前能叫壓入堆柱91什加3|就岷2乩3.0。,0)/向右將動(dòng)單位,向上移動(dòng)3單位?;豼1就(L0.5JQ); X和7向保持不費(fèi),彷而放大為原來(lái)的L5倍glCclor3f (0.0, 1.0f。.0);drawSquareQ;陶W魅為券色I(xiàn)E方形glPopMatrixt); 林惟統(tǒng)龍頂弓他一子莢障為當(dāng)前寐殺5T日口號(hào)3足耳-2.0廠:3,0,。4);朝句左移動(dòng)理位,向下移動(dòng)3單位01文己1討(。.5-51.6;“工方向保持不變,肪畫小為原來(lái)

20、的。-5倍,防向融大為原來(lái)的L 5倍。18匕3(00。1*。);d r mk5 qu升曳)/繪制魅為海色正方形glAush ();void main (mt argc, char*11 argv)vSize (600, 600):g I utCreat Wi ndow (Sea I;bit();glutDisplayFunc (m/Drawl);glutM a inLoop ();生成圖形:1欺速下載精品文檔注意理解:myDrawl ()和myDraw2()生成的圖形完全相同,為什么?(4)、綜合示例122欠迎下載精品文檔include void in it (void)JC 己己rColcx

21、 (1& LO, 1。0.0);gIMatrixMode CGL_PROJECnOR);gluOrtho2D (-5.Of S.O, -5,0, 5.0); 設(shè)置面的碼是X;-5Q-5.0r V:-5,0-5,0 glMatrixMode (GL_MODELVIEW);void比日櫛5qud演void) 繪制中心演直,娜為2腕打名(sIBegin (GL_POLYGON)/朝髭翩按兩寸針加glVertex2fHUat業(yè)2f (LM-L0O”彷下點(diǎn)glVertex2f (l.Of, LOf;/伯上方qlWrt白x (-L仇 L0D;/上點(diǎn)glEnd C );17欠0迎下載精品文檔void rry

22、Daw (vo d)glClear tGL_COLOFl_BUFFER_BIT); /清空 glLoadldentityQ;當(dāng)前矩陣設(shè)力單儂印車 glPghM 己 Ek();glTranslatef(O 幻匕2. OfQf);glScalef(3.Or0,5rl,O);glCo arjf (1.0, OQ Q,U);drBivSqjreC); 上面紅色碩glPoDMatriK(;:glPushMatrix(J;glTrantlateff-3.0,0,0,0.01;glPushMatrix(;glRjotatef(45.OfD,OrO.arl-O);qlCo w3f (0.0, L HO);drawSqjsreQ;中間左菱形glPopMatriwO:glTrans.latef3.0H0.0H0.0);glPushMatnx(J;glRjotatef(45.Of 0.0,0.0,1.0);glCo 口家(0.0r 0.7, Ci.O);drawSqu

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論