OpenGL圖形編程3二維觀察與三維變換(陳永強)_第1頁
OpenGL圖形編程3二維觀察與三維變換(陳永強)_第2頁
OpenGL圖形編程3二維觀察與三維變換(陳永強)_第3頁
OpenGL圖形編程3二維觀察與三維變換(陳永強)_第4頁
OpenGL圖形編程3二維觀察與三維變換(陳永強)_第5頁
已閱讀5頁,還剩41頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

旋轉(zhuǎn)

比例

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

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

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

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

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

glLoadIdentity;35投影變換平行投影視景體是一個矩形的平行管道,也就是一個長方體,其特點是無論物體距離相機多遠,投影后的物體大小尺寸不變。

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

glOrthogluOrtho2D

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

溫馨提示

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

評論

0/150

提交評論