OpenGL圖形編程3二維觀察與三維變換(陳永強(qiáng))_第1頁(yè)
OpenGL圖形編程3二維觀察與三維變換(陳永強(qiáng))_第2頁(yè)
OpenGL圖形編程3二維觀察與三維變換(陳永強(qiáng))_第3頁(yè)
OpenGL圖形編程3二維觀察與三維變換(陳永強(qiáng))_第4頁(yè)
OpenGL圖形編程3二維觀察與三維變換(陳永強(qiáng))_第5頁(yè)
已閱讀5頁(yè),還剩41頁(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)介

OpenGL圖形編程武漢紡織大學(xué)數(shù)學(xué)與計(jì)算機(jī)學(xué)院授課教師:陳永強(qiáng)教授3.OpenGL二維觀看與三維變換3.1二維觀看3.2三維變換33.1OpenGL二維觀看實(shí)現(xiàn)二維觀看的步驟:指定矩陣堆棧指定裁剪窗口指定視區(qū)4指定矩陣堆棧指定當(dāng)前操作的是投影矩陣堆棧glMatrixMode〔GL_PROJECTION〕;初始化,即指定當(dāng)前操作的矩陣堆棧的棧頂元素為單位矩陣。glLoadIdentity;5指定裁剪窗口定義二維裁剪窗口gluOtho2D(xwmin,xwmax,ywmin,ywmax);其中,雙精度浮點(diǎn)數(shù)xwmin,xwmax,

ywmin,ywmax分別對(duì)應(yīng)裁剪窗口的左、右、下、上四條邊界。默認(rèn)的裁剪窗口,四條邊界分別為wxl=-1.0,wxr=1.0,wyt=-1.0,wyb=1.0。6指定視區(qū)指定視區(qū)glViewPort〔xvmin,yvmin,vpWidth,vpHeighht〕;xvmin和yvmin指定了對(duì)應(yīng)于屏幕上顯示窗口中的矩形視區(qū)的左下角坐標(biāo),單位為像素。整型值vpWidth和vpHeighht則指定了視區(qū)的寬度和高度。默認(rèn)的視區(qū)大小和位置與顯示窗口保持全都。3.1OpenGL二維觀看例子教材【程序6-2】8變換種類模型視圖矩陣矩陣操作矩陣堆棧投影變換剪切變換3.2OpenGL中的變換9視圖變換:指定觀看者或攝影機(jī)的位置;模型變換:在場(chǎng)景中移動(dòng)對(duì)象;模型視圖變換:描述視圖變換與模型變換的對(duì)偶性;投影變換:對(duì)視見(jiàn)空間進(jìn)展修剪和轉(zhuǎn)變大??;視見(jiàn)區(qū)變換:對(duì)窗口的最終輸出進(jìn)展縮放;變換種類10視圖變換:指定觀看者或攝影機(jī)的位置;視圖變換是第一個(gè)應(yīng)用到場(chǎng)景上的變換。它用于確定場(chǎng)景的有利位置。默認(rèn)狀況下,觀看點(diǎn)位于原點(diǎn),順著z軸的負(fù)向看。視圖變換使你可以將觀看點(diǎn)放置在任何期望的位置上,從任何方向進(jìn)展觀看。確定視圖變換相當(dāng)于在場(chǎng)景中放置一部攝像機(jī)并確定其指向。在工作時(shí)間表上,必需先指定視圖變換再指定其他任何變換。變換種類11模型變換:在場(chǎng)景中移動(dòng)對(duì)象;模型變換用于處理模型和模型內(nèi)的特定對(duì)象。這些變換把對(duì)象移動(dòng)到適宜的位置,旋轉(zhuǎn)它們,并對(duì)它們進(jìn)展縮放。模型變換實(shí)際上就是幾何變換。變換種類12模型視圖變換:描述視圖變換與模型變換的對(duì)偶性;從內(nèi)部效果和它們對(duì)場(chǎng)景最終外觀的效果來(lái)說(shuō),視圖變換和模型變換是一樣的,把這兩者分開(kāi)完全是為了程序員的便利,向后移動(dòng)對(duì)象和向前移動(dòng)參考系之間并沒(méi)有本質(zhì)差異。術(shù)語(yǔ)“模型視圖”表示你可以把這類變換視為模型變換或視圖變換,但實(shí)際上并無(wú)區(qū)分,因此稱它為模型視圖變換。變換種類13投影變換:對(duì)視見(jiàn)空間進(jìn)展修剪和轉(zhuǎn)變大?。煌队白儞Q應(yīng)用到最終的模型視圖方向。投影實(shí)際上定義了視見(jiàn)空間并建立了修剪平面。更明確一些,投影變換指定已完成場(chǎng)景如何轉(zhuǎn)換成屏幕上的最終圖象。常用的投影變換包括正投影和透視投影。變換種類14視見(jiàn)區(qū)變換:對(duì)窗口的最終輸出進(jìn)展縮放;把場(chǎng)景的一個(gè)二維投影映射到屏幕上某處的窗口。這個(gè)到物理窗口坐標(biāo)的映射是最終完成的一項(xiàng)變換,它稱為視見(jiàn)區(qū)變換。變換種類15在計(jì)算機(jī)圖形學(xué)中,全部的變換都是通過(guò)矩陣乘法來(lái)實(shí)現(xiàn)的,立刻物體頂點(diǎn)構(gòu)成的齊次坐標(biāo)矩陣乘以三維變換矩陣就得到了變換后的物體頂點(diǎn)的齊次坐標(biāo)矩陣,這樣只要求出物體的三維變換矩陣,就可以得到變換后的物體。在OpenGL中,對(duì)象的坐標(biāo)變換也通過(guò)矩陣來(lái)實(shí)現(xiàn)的〔雖然并不愿定要自己定義矩陣〕。通常,在OpenGL中使用了兩個(gè)重要的矩陣:模型視圖矩陣和投影矩陣,其中模型視圖矩陣用于物體的模型視圖變換,投影矩陣用于投影變換。變換種類16有了模型視圖矩陣和投影矩陣,在OpenGL中從未加工的頂點(diǎn)數(shù)據(jù)到屏幕坐標(biāo)的過(guò)程就包括如下步驟:1.將頂點(diǎn)坐標(biāo)轉(zhuǎn)換為標(biāo)準(zhǔn)化齊次坐標(biāo)矩陣;2.將頂點(diǎn)的標(biāo)準(zhǔn)化齊次坐標(biāo)矩陣乘以模型視圖矩陣,生成變換后的頂點(diǎn)齊次坐標(biāo)矩陣;3.將變換后的頂點(diǎn)齊次坐標(biāo)矩陣乘以投影矩陣,生成修剪坐標(biāo)矩陣,這樣就有效地排解了視見(jiàn)空間之外的全部數(shù)據(jù)。4.由修剪坐標(biāo)除以w坐標(biāo),得到規(guī)格化的設(shè)備坐標(biāo)。留意,在變換過(guò)程中,模型視圖矩陣和投影視圖矩陣都有可能轉(zhuǎn)變坐標(biāo)的w值。5.坐標(biāo)三元組被視見(jiàn)區(qū)變換影射到一個(gè)2D平面。這也是一個(gè)矩陣變換,但在OpenGL中不能直接指定或修改它,系統(tǒng)會(huì)依據(jù)指定給glViewport的值在內(nèi)部設(shè)置它。變換種類17模型視圖矩陣用于指定場(chǎng)景的視圖變換和幾何變換,模型視圖矩陣是一個(gè)4×4的矩陣,它代表了用來(lái)放置和定位對(duì)象的經(jīng)過(guò)變換的坐標(biāo)系。在計(jì)算機(jī)圖形學(xué)中,物體進(jìn)展的幾何變換可以分解成多個(gè)根本幾何變換,而三維幾何變換矩陣是多個(gè)根本幾何變換矩陣相乘的結(jié)果。OpenGL供給了一些函數(shù)用于把任意矩陣設(shè)置成當(dāng)前操作的矩陣〔模型視圖矩陣或投影矩陣〕。模型視圖矩陣18glfloatm[]={1.0f,0.0f,3.0f,0.0f,0.0f,1.0f,0.0f,1.0f,0.0f,0.0f,1.0f,1.0f,0.0f,0.0f,0.0f,1.0f,};glMatrixMode(GL_MODELVIEW);glLoadMatrixf(m);這段程序中,先聲明白一個(gè)數(shù)組來(lái)保存4×4矩陣的值,留意這里矩陣按列優(yōu)先挨次保存,這意味著先從上往下遍歷每一列;然后使用glLoadMatrix函數(shù)將定義的矩陣設(shè)置為當(dāng)前操作的矩陣。模型視圖矩陣19假設(shè)需要執(zhí)行變換,即把定義的矩陣乘到模型視圖矩陣中??梢允褂煤瘮?shù)glMultmatrix,其函數(shù)原型如下:voidglMultMatrix{fd}(constTYPE*m);參數(shù)m為一個(gè)以列優(yōu)先挨次保存16個(gè)連續(xù)值的數(shù)組。模型視圖矩陣20平移

旋轉(zhuǎn)

比例

模型視圖矩陣21平移voidglTranslate{fd}(TYPEx,TYPEy,TYPEz);參數(shù)x,y,z就是目標(biāo)分別沿三個(gè)軸的正向平移的偏移量。這個(gè)函數(shù)用這三個(gè)偏移量生成的矩陣完成乘法。當(dāng)參數(shù)是(0.0,0.0,0.0)時(shí),生成的矩陣是單位矩陣,此時(shí)對(duì)物體沒(méi)有影響。模型視圖矩陣22旋轉(zhuǎn)voidglRotate{fd}(TYPEangle,TYPEx,TYPEy,TYPEz);函數(shù)中第一個(gè)參數(shù)是表示目標(biāo)沿從原點(diǎn)到指定點(diǎn)(x,y,z)的方向矢量逆時(shí)針旋轉(zhuǎn)的角度,后三個(gè)參數(shù)則是指定旋轉(zhuǎn)方向矢量的坐標(biāo)。這個(gè)函數(shù)表示用這四個(gè)參數(shù)生成的矩陣完成乘法。當(dāng)角度參數(shù)是0.0時(shí),表示對(duì)物體沒(méi)有影響。

模型視圖矩陣23比例voidglScale{fd}(TYPEx,TYPEy,TYPEz);三個(gè)參數(shù)值就是目標(biāo)分別沿三個(gè)軸向縮放的比例因子。這個(gè)函數(shù)用這三個(gè)比例因子生成的矩陣完成乘法。這個(gè)函數(shù)能完成沿相應(yīng)的軸對(duì)目標(biāo)進(jìn)展拉伸、壓縮和反射三項(xiàng)功能。當(dāng)參數(shù)是(1.0,1.0,1.0)時(shí),對(duì)物體沒(méi)有影響。當(dāng)其中某個(gè)參數(shù)為負(fù)值時(shí),表示將對(duì)目標(biāo)進(jìn)展相應(yīng)軸的反射變換,且這個(gè)參數(shù)不為1.0,則還要進(jìn)展相應(yīng)軸的縮放變換。最好不要令三個(gè)參數(shù)值都為零,這將導(dǎo)致目標(biāo)沿三軸都縮為零。模型視圖矩陣模型視圖矩陣視圖變換函數(shù)〔定義觀看坐標(biāo)系〕voidgluLookAt〔GLdoubleeyex,GLdoubleeyey,GLdoubleeyez,GLdoublecenterx,GLdoublecentery,GLdoublecenterz,GLdoubleupx,GLdoubleupy,GLdoubleupz〕;視點(diǎn)位置:〔eyex,eyey,eyez)參考點(diǎn)位置:〔centerx,centery,centerz)向上矢量方向:(upx,upy,upz)模型視圖矩陣?yán)蛹t皮書(shū)cube.cmodel.c26矩陣操作矩陣堆棧選擇

glMatrixMode(GLenummode);參數(shù)mode用于確定將哪個(gè)矩陣堆棧用于矩陣操作。GL_MODELVIEW:模型視圖矩陣堆棧GL_PROJECTION:投影矩陣堆棧GL_TEXTURE:紋理矩陣堆棧

27矩陣操作通過(guò)上述的高級(jí)矩陣函數(shù),可以很便利地實(shí)現(xiàn)變換。問(wèn)題:在調(diào)用函數(shù)時(shí),修改的是當(dāng)前的模型視圖矩陣。新的矩陣隨后將成為當(dāng)前的模型視圖矩陣并影響此后繪制的圖形。這樣模型視圖矩陣函數(shù)在調(diào)用時(shí),就會(huì)造成效果的積存。28矩陣操作效果積存一段代碼://沿x軸正向移動(dòng)10個(gè)單位glTranslatef(10.0f,0.0f,0.0f);glutSolidSphere(1.0f,15,15);//沿y軸正向移動(dòng)10個(gè)單位glTranslatef(0.0f,10.0f,0.0f);glutSolidSphere(1.0f);這段代碼繪制了兩個(gè)球,第一個(gè)繪制的球的球心沿x軸正向移動(dòng)了10個(gè)單位,而其次球不僅沿y軸正向移動(dòng)10個(gè)單位,也沿x軸正向移動(dòng)10個(gè)單位。這就是效果積存。矩陣操作單位矩陣glTranslatef(10.0f,0.0f,0.0f);glutSolidSphere(1.0f,15,15);glTranslatef(0.0f,10.0f,0.0f);glutSolidSphere(1.0f,15,15);想要其次個(gè)球只沿y軸正向移動(dòng)10個(gè)單位,一種簡(jiǎn)潔的方法是把模型矩陣復(fù)位,即通過(guò)給模型視圖矩陣加載上單位矩陣來(lái)復(fù)位原點(diǎn)。

glMatrixMode(GL_MODELVIEW);glLoadIdentity();30矩陣堆棧實(shí)際上,在創(chuàng)立、裝入、相乘模型變換和投影變換矩陣時(shí),都已用到堆棧操作。一般說(shuō)來(lái),矩陣堆棧常用于構(gòu)造具有繼承性的模型,即由一些簡(jiǎn)潔目標(biāo)構(gòu)成簡(jiǎn)潔模型。而在構(gòu)造簡(jiǎn)潔模型時(shí),常常需要保存中間的變化狀態(tài),以便在進(jìn)展一些變換后能夠恢復(fù)。31矩陣堆棧OpenGL為模型視圖矩陣和投影矩陣各維護(hù)著一個(gè)“矩陣堆?!?,可以把當(dāng)前矩陣壓到堆棧中保存它,然后對(duì)當(dāng)前矩陣進(jìn)展修改。把矩陣彈出堆棧即可恢復(fù)。使用的函數(shù)如下:voidglPushMatrix(void); voidglPopMatrix(void);32矩陣堆棧函數(shù)glPushMatrix用于將當(dāng)前矩陣壓入當(dāng)前矩陣堆棧,常用于保存當(dāng)前變換矩陣。函數(shù)glPopMatrix用于將最終一個(gè)〔最頂上的〕矩陣彈出當(dāng)前矩陣堆棧,常用于恢復(fù)當(dāng)前變換矩陣原先的狀態(tài),假設(shè)曾經(jīng)調(diào)用glPushMatrix把它保存起來(lái)的話。33矩陣堆棧堆棧是有深度的,假設(shè)超出了堆棧深度或當(dāng)堆棧為空時(shí)試圖彈出一個(gè)矩陣值,都會(huì)發(fā)生錯(cuò)誤??梢杂孟旅娴暮瘮?shù)獵取堆棧深度的最大值:glGet(GL_MAX_MODELVIEW_STACK_DEPTH);glGet(GL_MAX_PROJECTION_STACK_DEPTH);34投影變換OpenGL中只供給了兩種投影方式,一種是平行投影〔正射投影〕,另一種是透視投影。在投影變換之前必需指定當(dāng)前處理的是投影變換矩陣:glMatrixMode(GL_PROJECTION);

glLoadIdentity;35投影變換平行投影視景體是一個(gè)矩形的平行管道,也就是一個(gè)長(zhǎng)方體,其特點(diǎn)是無(wú)論物體距離相機(jī)多遠(yuǎn),投影后的物體大小尺寸不變。

OpenGL中平行投影函數(shù)共有兩個(gè):

glOrthogluOrtho2D

36投影變換voidglOrtho(GLdoubleleft,GLdoubleright,GLdoublebottom,GLdoubletop,GLdoublenear,GLdoublefar);函數(shù)的操作是創(chuàng)立一個(gè)正射投影矩陣,并且用這個(gè)矩陣乘以當(dāng)前矩陣。近裁剪平面是一個(gè)矩形,矩形左下角點(diǎn)三維空間坐標(biāo)是〔left,bottom,-near〕,右上角點(diǎn)是〔right,top,-near〕;遠(yuǎn)裁剪平面也是一個(gè)矩形,左下角點(diǎn)空間坐標(biāo)是〔left,bottom,-far〕,右上角點(diǎn)是〔right,top,-far〕。全部的near和far值同時(shí)為正或同時(shí)為負(fù)。假設(shè)沒(méi)有其他變換,正射投影的方向平行于Z軸,且視點(diǎn)朝向Z負(fù)軸。這意味著物體在視點(diǎn)前面時(shí)far和near都為負(fù)值,物體在視點(diǎn)后面時(shí)far和near都為正值。37投影變換voidgluOrtho2D(GLdoubleleft,GLdoubleright,GLdoublebottom,GLdoubletop);一個(gè)特殊的正射投影函數(shù),主要用于二維圖像到二維屏幕上的投影。其near和far缺省值分別為-1.0和1.0,全部二維物體的Z坐標(biāo)都為0.0。裁剪面是一個(gè)左下角點(diǎn)為〔left,bottom〕、右上角點(diǎn)為〔right,top〕的矩形。投影變換透視投影透視投影的特點(diǎn)是距離視點(diǎn)近的物體大,距離視點(diǎn)遠(yuǎn)的物體小,遠(yuǎn)到極點(diǎn)即為消逝,成為滅點(diǎn)。它的視景體類似于一個(gè)頂部和底部都被切除掉的棱椎,也就是棱臺(tái)。OpenGL透視投影函數(shù)也有兩個(gè):glFrustumgluPerspective投影變換voidglFrustum(GLdoubleleft,GLdoubleright,GLdoublebottom,GLdoubletop,GLdoublenear,GLdoublefar);此函數(shù)創(chuàng)立一個(gè)透視投影矩陣,并且用這個(gè)矩陣乘以當(dāng)前矩陣。參數(shù)只定義近裁剪平面的左下角點(diǎn)和右上角點(diǎn)的三維空間坐標(biāo),即〔left,bottom,-near〕和〔right,top,-near〕;最終一個(gè)參數(shù)far是遠(yuǎn)裁剪平面的Z負(fù)值,其左下角點(diǎn)和右上角點(diǎn)空間坐標(biāo)由函數(shù)依據(jù)透視投影原理自動(dòng)生成。near和far表示離視點(diǎn)的遠(yuǎn)近,它們總為正值。voidgluPerspective(GLdoublefovy,GLdoubleaspect,GLdoublenear,GLdoublefar);它也創(chuàng)立一個(gè)對(duì)稱透視視景體

溫馨提示

  • 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)論