




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、OpenGL坐標(biāo)變換專題OpenGL通過相機模擬、可以實現(xiàn)計算機圖形學(xué)中最基本的三維變換,即幾何變換、投影變換、裁剪變換、視口變換等,同時,OpenGL還實現(xiàn)了矩陣堆棧等。理解掌握了有關(guān)坐標(biāo)變換的內(nèi)容,就算真正走進了精彩地三維世界。一、OpenGL中的三維物體的顯示 (一)坐標(biāo)系統(tǒng) 在現(xiàn)實世界中,所有的物體都具有三維特征,但計算機本身只能處理數(shù)字,顯示二維的圖形,將三維物體及二維數(shù)據(jù)聯(lián)系在一起的唯一紐帶就是坐標(biāo)。 為了使被顯示的三維物體數(shù)字化,要在被顯示的物體所在的空間中定義一個坐標(biāo)系。這個坐標(biāo)系的長度單位和坐標(biāo)軸的方向要適合對被顯示物體的描述,這個坐標(biāo)系稱為世界坐標(biāo)系。世界坐標(biāo)系是始終固定不
2、變的。 OpenGL還定義了局部坐標(biāo)系的概念,所謂局部坐標(biāo)系,也就是坐標(biāo)系以物體的中心為坐標(biāo)原點,物體的旋轉(zhuǎn)或平移等操作都是圍繞局部坐標(biāo)系進行的,這時,當(dāng)物體模型進行旋轉(zhuǎn)或平移等操作時,局部坐標(biāo)系也執(zhí)行相應(yīng)的旋轉(zhuǎn)或平移操作。需要注意的是,如果對物體模型進行縮放操作,則局部坐標(biāo)系也要進行相應(yīng)的縮放,如果縮放比例在案各坐標(biāo)軸上不同,那么再經(jīng)過旋轉(zhuǎn)操作后,局部坐標(biāo)軸之間可能不再相互垂直。無論是在世界坐標(biāo)系中進行轉(zhuǎn)換還是在局部坐標(biāo)系中進行轉(zhuǎn)換,程序代碼是相同的,只是不同的坐標(biāo)系考慮的轉(zhuǎn)換方式不同罷了。計算機對數(shù)字化的顯示物體作了加工處理后,要在圖形顯示器上顯示,這就要在圖形顯示器屏幕上定義一個二維直角
3、坐標(biāo)系,這個坐標(biāo)系稱為屏幕坐標(biāo)系。這個坐標(biāo)系坐標(biāo)軸的方向通常取成平行于屏幕的邊緣,坐標(biāo)原點取在左下角,長度單位常取成一個象素。(二)三維物體的相機模擬 為了說明在三維物體到二維圖象之間,需要經(jīng)過什么樣的變換,我們引入了相機(Camera)模擬的方式,假定用相機來拍攝這個世界,那么在相機的取景器中,就存在人眼和現(xiàn)實世界之間的一個變換過程。圖一、相機模擬OpenGL中的各種坐標(biāo)變換從三維物體到二維圖象,就如同用相機拍照一樣,通常都要經(jīng)歷以下幾個步驟:1、將相機置于三角架上,讓它對準(zhǔn)三維景物,它相當(dāng)于OpenGL中調(diào)整視點的位置,即視點變換(Viewing Transformation)。2、將三維
4、物體放在場景中的適當(dāng)位置,它相當(dāng)于OpenGL中的模型變換(Modeling Transformation),即對模型進行旋轉(zhuǎn)、平移和縮放。3、選擇相機鏡頭并調(diào)焦,使三維物體投影在二維膠片上,它相當(dāng)于OpenGL中把三維模型投影到二維屏幕上的過程,即OpenGL的投影變換(Projection Transformation),OpenGL中投影的方法有兩種,即正射投影和透視投影。為了使顯示的物體能以合適的位置、大小和方向顯示出來,必須要通過投影。有時為了突出圖形的一部分,只把圖形的某一部分顯示出來,這時可以定義一個三維視景體(Viewing Volume)。正射投影時一般是一個長方體的視景體,
5、透視投影時一般是一個棱臺似的視景體。只有視景體內(nèi)的物體能被投影在顯示平面上,其他部分則不能。4、沖洗底片,決定二維相片的大小,它相當(dāng)與OpenGL中的視口變換(Viewport Transformation)(在屏幕窗口內(nèi)可以定義一個矩形,稱為視口(Viewport),視景體投影后的圖形就在視口內(nèi)顯示)規(guī)定屏幕上顯示場景的范圍和尺寸。通過上面的幾個步驟,一個三維空間里的物體就可以用相應(yīng)的二維平面物體表示了,也就能在二維的電腦屏幕上正確顯示了??偟膩碚f,三維物體的顯示過程如下:圖二、三維物體的顯示過程二、OpenGL中的幾種變換OpenGL中的各種轉(zhuǎn)換是通過矩陣運算實現(xiàn)的,具體的說,就是當(dāng)發(fā)出一
6、個轉(zhuǎn)換命令時,該命令會生成一個4X4階的轉(zhuǎn)換矩陣(OpenGL中的物體坐標(biāo)一律采用齊次坐標(biāo),即(x, y, z, w),故所有變換矩陣都采用4X4矩陣),當(dāng)前矩陣與這個轉(zhuǎn)換矩陣相乘,從而生成新的當(dāng)前矩陣。例如,對于頂點坐標(biāo)v ,轉(zhuǎn)換命令通常在頂點坐標(biāo)命令之前發(fā)出,若當(dāng)前矩陣為C,轉(zhuǎn)換命令構(gòu)成的矩陣為M,則發(fā)出轉(zhuǎn)換命令后,生成的新的當(dāng)前矩陣為CM,這個矩陣再乘以頂點坐標(biāo) v,從而構(gòu)成新的頂點坐標(biāo)CMv。上述過程說明,程序中繪制頂點前的最后一個變換命令最先作用于頂點之上。這同時也說明,OpenGL編程中,實際的變換順序與指定的順序是相反的。(一)視點變換 視點變換確定了場景中物體的視點位置和方向,
7、就向上邊提到的,它象是在場景中放置了一架照相機,讓相機對準(zhǔn)要拍攝的物體。確省時,相機(即視點)定位在坐標(biāo)系的原點(相機初始方向都指向Z負軸),它同物體模型的缺省位置是一致的,顯然,如果不進行視點變換,相機和物體是重疊在一起的。 執(zhí)行視點變換的命令和執(zhí)行模型轉(zhuǎn)換的命令是相同的,想一想,在用相機拍攝物體時,我們可以保持物體的位置不動,而將相機移離物體,這就相當(dāng)于視點變換;另外,我們也可以保持相機的固定位置,將物體移離相機,這就相當(dāng)于模型轉(zhuǎn)換。這樣,在OpenGL中,以逆時針旋轉(zhuǎn)物體就相當(dāng)于以順時針旋轉(zhuǎn)相機。因此,我們必須把視點轉(zhuǎn)換和模型轉(zhuǎn)換結(jié)合在一起考慮,而對這兩種轉(zhuǎn)換單獨進行考慮是毫無意義的。
8、除了用模型轉(zhuǎn)換命令執(zhí)行視點轉(zhuǎn)換之外,OpenGL實用庫還提供了gluLookAt()函數(shù),該函數(shù)有三個變量,分別定義了視點的位置、相機瞄準(zhǔn)方向的參考點以及相機的向上方向。該函數(shù)的原型為:void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble upx,GLdouble upy,GLdouble upz);該函數(shù)定義了視點矩陣,并用該矩陣乘以當(dāng)前矩陣。eyex,eyey,eyez定義了視點的位置;centerx、centery和centerz變量指定了參考
9、點的位置,該點通常為相機所瞄準(zhǔn)的場景中心軸線上的點;upx、upy、upz變量指定了向上向量的方向。 通常,視點轉(zhuǎn)換操作在模型轉(zhuǎn)換操作之前發(fā)出,以便模型轉(zhuǎn)換先對物體發(fā)生作用。場景中物體的頂點經(jīng)過模型轉(zhuǎn)換之后移動到所希望的位置,然后再對場景進行視點定位等操作。模型轉(zhuǎn)換和視點轉(zhuǎn)換共同構(gòu)成模型視景矩陣。(二)模型變換 模型變換是在世界坐標(biāo)系中進行的。缺省時,物體模型的中心定位在坐標(biāo)系的中心處。OpenGL在這個坐標(biāo)系中,有三個命令,可以模型變換。1、模型平移glTranslatefd(TYPE x,TYPE y,TYPE z);該函數(shù)用指定的x,y,z值沿著x軸、y軸、z軸平移物體(或按照相同的量值
10、移動局部坐標(biāo)系)。2、模型旋轉(zhuǎn) glRotatefd(TYPE angle,TYPE x,TYPE,y,TYPE z);該函數(shù)中第一個變量angle制定模型旋轉(zhuǎn)的角度,單位為度,后三個變量表示以原點(0,0,0)到點(x,y,z)的連線為軸線逆時針旋轉(zhuǎn)物體。例如,glRotatef(45.0,0.0,0.0,1.0)的結(jié)果是繞z軸旋轉(zhuǎn)45度。3、模型縮放glScalefd(TYPE x,TYPE y,TYPE z);該函數(shù)可以對物體沿著x,y,z軸分別進行放大縮小。函數(shù)中的三個參數(shù)分別是x、y、z軸方向的比例變換因子。缺省時都為1.0,即物體沒變化。程序中物體Y軸比例為2.0,其余都為1.0,
11、就是說將立方體變成長方體。(三)投影變換 經(jīng)過模型視景的轉(zhuǎn)換后,場景中的物體放在了所希望的位置上,但由于顯示器只能用二維圖象顯示三維物體,因此就要靠投影來降低維數(shù)(投影變換類似于選擇相機的鏡頭)。 事實上,投影變換的目的就是定義一個視景體,使得視景體外多余的部分裁剪掉,最終進入圖像的只是視景體內(nèi)的有關(guān)部分。投影包括透視投影(Perspective Projection)和正視投影(Orthographic Projection)兩種。透視投影,符合人們心理習(xí)慣,即離視點近的物體大,離視點遠的物體小,遠到極點即為消失,成為滅點。它的視景體類似于一個頂部和底部都被進行切割過的棱椎,也就是棱臺。這個
12、投影通常用于動畫、視覺仿真以及其它許多具有真實性反映的方面。 OpenGL透視投影函數(shù)有兩個,其中函數(shù)glFrustum()的原型為:void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);它創(chuàng)建一個透視視景體。其操作是創(chuàng)建一個透視投影矩陣,并且用這個矩陣乘以當(dāng)前矩陣。這個函數(shù)的參數(shù)只定義近裁剪平面的左下角點和右上角點的三維空間坐標(biāo),即(left,bottom,-near)和(right,top,-near);最后一個參數(shù)far是遠裁剪平面的Z負值,
13、其左下角點和右上角點空間坐標(biāo)由函數(shù)根據(jù)透視投影原理自動生成。near和far表示離視點的遠近,它們總為正值。該函數(shù)形成的視景體如圖三所示。圖三、透視投影視景體另一個透視函數(shù)是:void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);它也創(chuàng)建一個對稱透視視景體,但它的參數(shù)定義于前面的不同,參數(shù)fovy定義視野在X-Z平面的角度,范圍是0.0, 180.0;參數(shù)aspect是投影平面寬度與高度的比率;參數(shù)zNear和Far分別是遠近裁剪面沿Z負軸到視點的距離,它們總為正值。圖四、透視投影視景體
14、以上兩個函數(shù)缺省時,視點都在原點,視線沿Z軸指向負方向。正射投影,又叫平行投影。這種投影的視景體是一個矩形的平行管道,也就是一個長方體,如圖五所示。正射投影的最大一個特點是無論物體距離相機多遠,投影后的物體大小尺寸不變。這種投影通常用在建筑藍圖繪制和計算機輔助設(shè)計等方面,這些行業(yè)要求投影后的物體尺寸及相互間的角度不變,以便施工或制造時物體比例大小正確。圖五、正射投影視景體OpenGL正射投影函數(shù)也有兩個,一個函數(shù)是:void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top, GLdouble near,GLdo
15、uble far)它創(chuàng)建一個平行視景體。實際上這個函數(shù)的操作是創(chuàng)建一個正射投影矩陣,并且用這個矩陣乘以當(dāng)前矩陣。其中近裁剪平面是一個矩形,矩形左下角點三維空間坐標(biāo)是(left,bottom,-near),右上角點是(right,top,-near);遠裁剪平面也是一個矩形,左下角點空間坐標(biāo)是(left,bottom,-far),右上角點是(right,top,-far)。所有的near和far值同時為正或同時為負。如果沒有其他變換,正射投影的方向平行于Z軸,且視點朝向Z負軸。這意味著物體在視點前面時far和near都為負值,物體在視點后面時far和near都為正值。另一個函數(shù)是:void gl
16、uOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)(四)視口變換。視口變換就是將視景體內(nèi)投影的物體顯示在二維的視口平面上。運用相機模擬方式,我們很容易理解視口變換就是類似于照片的放大與縮小。在計算機圖形學(xué)中,它的定義是將經(jīng)過幾何變換、投影變換和裁剪變換后的物體顯示于屏幕窗口內(nèi)指定的區(qū)域內(nèi),這個區(qū)域通常為矩形,稱為視口。OpenGL中相關(guān)函數(shù)是:glViewport(GLint x,GLint y,GLsizei width, GLsizei height);這個函數(shù)定義一個視口。函數(shù)參數(shù)(x, y)是視口在屏幕
17、窗口坐標(biāo)系中的左下角點坐標(biāo),參數(shù)width和height分別是視口的寬度和高度。缺省時,參數(shù)值即(0, 0, winWidth, winHeight) 指的是屏幕窗口的實際尺寸大小。所有這些值都是以象素為單位,全為整型數(shù)。(5)裁剪變換在OpenGL中,除了視景體定義的六個裁剪平面(上、下、左、右、前、后)外,用戶還可自己再定義一個或多個附加裁剪平面,以去掉場景中無關(guān)的目標(biāo),如圖六所示。圖六、附加裁剪平面附加平面裁剪函數(shù)為:1、void glClipPlane(GLenum plane,Const GLdouble *equation);函數(shù)參數(shù)equation指向一個擁有四個系數(shù)值的數(shù)組,這
18、四個系數(shù)分別是裁剪平面Ax+By+Cz+D=0的A、B、C、D值。因此,由這四個系數(shù)就能確定一個裁剪平面。參數(shù)plane是GL_CLIP_PLANEi(i=0,1,.),指定裁剪面號。在調(diào)用附加裁剪函數(shù)之前,必須先啟動glEnable(GL_CLIP_PLANEi),使得當(dāng)前所定義的裁剪平面有效;當(dāng)不再調(diào)用某個附加裁剪平面時,可用glDisable(GL_CLIP_PLANEi)關(guān)閉相應(yīng)的附加裁剪功能。下面這個例子不僅說明了附加裁剪函數(shù)的用法,而且調(diào)用了gluPerspective()透視投影函數(shù),讀者可以細細體會其中的用法。例程如下:#include "glos.h"#i
19、nclude <GL/gl.h>#include <GL/glu.h>#include <GL/glaux.h>void myinit(void);void CALLBACK myReshape(GLsizei w, GLsizei h);void CALLBACK display(void);void CALLBACK display(void)GLdouble eqn4 = 1.0, 0.0, 0.0, 0.0;glClear(GL_COLOR_BUFFER_BIT);glColor3f (1.0, 0.0, 1.0);glPushMatrix();gl
20、Translatef (0.0, 0.0, -5.0);/* clip the left part of wire_sphere : x<0 */glClipPlane (GL_CLIP_PLANE0, eqn);glEnable (GL_CLIP_PLANE0);glRotatef (-90.0, 1.0, 0.0, 0.0);auxWireSphere(1.0);glPopMatrix();glFlush();void myinit (void)glShadeModel (GL_FLAT);void CALLBACK myReshape(GLsizei w, GLsizei h)gl
21、Viewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity(); gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);glMatrixMode(GL_MODELVIEW); void main(void)auxInitDisplayMode (AUX_SINGLE | AUX_RGB);auxInitPosition (0, 0, 500, 500);auxInitWindow ("Arbitrary Clipping Planes");myinit ();auxReshapeFunc (myReshape);auxMainLoop(display);(六)矩陣棧的操
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度美容院轉(zhuǎn)讓合同附帶美容院供應(yīng)鏈優(yōu)化與成本控制
- 二零二五年度蔬菜配送中心與餐飲企業(yè)合作協(xié)議
- 2025年度橋梁施工環(huán)境保護與生態(tài)修復(fù)合同
- 二零二五年度鏈家房屋買賣定金協(xié)議模板及簽訂指南
- 二零二五年度銀行賬戶監(jiān)管協(xié)議:金融機構(gòu)賬戶監(jiān)管與反洗錢合作協(xié)議
- 二零二五年度家政服務(wù)用工協(xié)議書(家庭廚師及護理)
- 二零二五年度果園農(nóng)產(chǎn)品品牌授權(quán)轉(zhuǎn)讓協(xié)議
- 2025年度項目經(jīng)理內(nèi)部承包責(zé)任制與合同履行進度合同
- 二零二五年度綠色建筑抵押貸款合作協(xié)議范本
- 2025年度新能源項目股權(quán)合作協(xié)議
- GB∕T 28610-2020 甲基乙烯基硅橡膠
- GB∕T 7588.1-2020 電梯制造與安裝安全規(guī)范 第1部分:乘客電梯和載貨電梯
- 4.昆蟲備忘錄 課件(共15張PPT)
- DB37∕T 5191-2021 高延性混凝土加固技術(shù)規(guī)程
- 2022年全省公訴業(yè)務(wù)知識考試參考答案
- 鎮(zhèn)政府(街道辦事處)辦公大樓平面圖
- 軟壓光機計算說明
- 森林防火安全責(zé)任書(施工隊用)
- 水庫應(yīng)急搶險與典型案例分析
- 優(yōu)秀教研組展示(課堂PPT)
- 楊欽和教授-中西醫(yī)結(jié)合治療慢性肝病的體會
評論
0/150
提交評論