計(jì)算機(jī)圖形學(xué):(4-4)幾何對(duì)象與變換-OpenGL變換_第1頁(yè)
計(jì)算機(jī)圖形學(xué):(4-4)幾何對(duì)象與變換-OpenGL變換_第2頁(yè)
計(jì)算機(jī)圖形學(xué):(4-4)幾何對(duì)象與變換-OpenGL變換_第3頁(yè)
計(jì)算機(jī)圖形學(xué):(4-4)幾何對(duì)象與變換-OpenGL變換_第4頁(yè)
計(jì)算機(jī)圖形學(xué):(4-4)幾何對(duì)象與變換-OpenGL變換_第5頁(yè)
已閱讀5頁(yè),還剩35頁(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、1Angel: Interactive Computer Graphics 5E Addison-Wesley 2009幾何對(duì)象與變換-幾何原著:Ed Angel編輯 武漢大學(xué)計(jì)算機(jī)學(xué)院圖形學(xué)課程組2Angel: Interactive Computer Graphics 5E Addison-Wesley 2009基本內(nèi)容學(xué)習(xí)在OpenGL中如何進(jìn)行變換旋轉(zhuǎn)平移縮放平滑旋轉(zhuǎn)技術(shù)四元數(shù)虛擬跟蹤球當(dāng)前變換矩陣(CTM)從概念上說(shuō),當(dāng)前變換矩陣(CTM)就是一個(gè)4x4階的齊次坐標(biāo)矩陣,它是狀態(tài)的一部分,被應(yīng)用到經(jīng)過(guò)流水線中的所有頂點(diǎn)CTM是在應(yīng)用程序中定義的,并被加載到變換單元中3Angel: I

2、nteractive Computer Graphics 5E Addison-Wesley 2009CTM運(yùn)算CTM可以被改變,改變的方法是加載一個(gè)新的CTM或者右乘一個(gè)矩陣加載單位陣:C I加載任意矩陣:C M加載一個(gè)平移矩陣:C T加載一個(gè)旋轉(zhuǎn)矩陣:C R加載一個(gè)縮放矩陣:C S右乘任意矩陣:C CM右乘一個(gè)平移矩陣:C CT右乘一個(gè)旋轉(zhuǎn)矩陣:C CR右乘一個(gè)縮放矩陣:C CS4Angel: Interactive Computer Graphics 5E Addison-Wesley 2009繞固定點(diǎn)的旋轉(zhuǎn)從單位陣開始:CI把固定點(diǎn)移到原點(diǎn):CCT旋轉(zhuǎn):CCR把固定點(diǎn)移回到原處:CCT

3、 -1結(jié)果:C = TR T 1是逆向的注意:在程序中最后指定的運(yùn)算是最先被執(zhí)行的運(yùn)算5Angel: Interactive Computer Graphics 5E Addison-Wesley 2009倒轉(zhuǎn)次序我們想要得到C = T 1R T 所以必須按下面的次序進(jìn)行運(yùn)算CICCT -1CCRCCT每個(gè)運(yùn)算對(duì)應(yīng)于程序中的一個(gè)函數(shù)調(diào)用6Angel: Interactive Computer Graphics 5E Addison-Wesley 2009OpenGL中的CTM在OpenGL的流水線中有一個(gè)模型視圖矩陣和一個(gè)投影矩陣,這兩個(gè)矩陣復(fù)合在一起構(gòu)成CTM可以通過(guò)首先設(shè)置正確的矩陣模式處

4、理每個(gè)矩陣7Angel: Interactive Computer Graphics 5E Addison-Wesley 2009OpenGL中的矩陣在OpenGL中矩陣是狀態(tài)的一部分有多種類型模型視圖(GL_MODELVIEW)投影(GL_PROJECTION)用于操作的單組函數(shù)選擇所操作的對(duì)象glMatrixMode(GL_MODELVIEW);glMatrixMode(GL_PROJECTION); 8Angel: Interactive Computer Graphics 5E Addison-Wesley 2009旋轉(zhuǎn)、平移、縮放加載單位陣:glLoadIdentity()右乘變換矩

5、陣:glRotatef(theta, vx, vy, vz)theta以角度為單位,(vx,vy,vz)定義旋轉(zhuǎn)軸glTranslatef(dx, dy, dz)glScalef( sx, sy, sz)每個(gè)函數(shù)的參數(shù)還可以是d(double)類型9Angel: Interactive Computer Graphics 5E Addison-Wesley 2009示例固定點(diǎn)為(1.0, 2.0, 3.0), 繞z軸旋轉(zhuǎn)30glMatrixMode(GL_MODELVIEW);glLoadIdentity();/此命令不會(huì)把投影矩陣重設(shè)glTranslated(1.0, 2.0, 3.0);g

6、lRotated(30.0, 0.0, 0.0, 1.0);glTranslatef(-1.0, -2.0, -3.0);記住在程序中最后指定的矩陣是最先被執(zhí)行的操作10Angel: Interactive Computer Graphics 5E Addison-Wesley 2009任意矩陣可以加載應(yīng)用程序中定義的矩陣,或者使之與CTM相乘glLoadMatrixf(m)glMultMatrixf(m)矩陣m是有16個(gè)元素的一維數(shù)組,按列定義了4x4矩陣在glMultMatrixf(m)中m右乘當(dāng)前矩陣11Angel: Interactive Computer Graphics 5E Ad

7、dison-Wesley 2009任意矩陣12Angel: Interactive Computer Graphics 5E Addison-Wesley 2009設(shè)置當(dāng)前矩陣中的元素值。函數(shù)參數(shù)*m是一個(gè)指向16個(gè)元素(m0,m1,.,m15)的指針這16個(gè)元素就是當(dāng)前矩陣 M 中的元素,其排 列方式如下: 任意矩陣16維向量m=(m0, m1,m15)指定的列主序矩陣為C語(yǔ)言定義的矩陣m44是行主序的,元素mij相當(dāng)于OpenGL變換矩陣的i列j行元素。為避免行列混淆,聲明矩陣為m1613Angel: Interactive Computer Graphics 5E Addison-Wes

8、ley 2009矩陣堆棧許多情況中需要保存變換矩陣,待稍后再用遍歷層次數(shù)據(jù)結(jié)構(gòu)當(dāng)執(zhí)行顯示列表時(shí)避免狀態(tài)改變OpenGL為每種類型的矩陣維持一個(gè)堆棧應(yīng)用下述函數(shù)處理矩陣堆棧(也是由glMatrixMode設(shè)置矩陣類型)glPushMatrix()glPopMatrix()14Angel: Interactive Computer Graphics 5E Addison-Wesley 2009讀入后臺(tái)矩陣OpenGL狀態(tài)中有些信息是以矩陣形式保存的,可以利用查詢函數(shù)讀入矩陣(以及其它部分的狀態(tài))glGetIntegervglGetFloatvglGetBooleanvglGetDoublev例如,

9、對(duì)于模型視圖矩陣:double m16;glGetDoublev(GL_MODELVIEW_MATRIX,m);15Angel: Interactive Computer Graphics 5E Addison-Wesley 2009變換的應(yīng)用例如:應(yīng)用空閑函數(shù)旋轉(zhuǎn)立方體,鼠標(biāo)函數(shù)改變旋轉(zhuǎn)的方向從一個(gè)畫立方體的程序開始(cube.c)立方體中心在原點(diǎn)各方向與坐標(biāo)軸平行16Angel: Interactive Computer Graphics 5E Addison-Wesley 2009main()int main(int argc, char *argv)glutInit(&argc, ar

10、gv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(500, 500); glutCreateWindow(colorcube); glutReshapeFunc(myReshape); glutDisplayFunc(display);glutIdleFunc(spinCube);glutMouseFunc(mouse);glEnable(GL_DEPTH_TEST); glutMainLoop();17Angel: Interactive Computer Graphics 5E Addi

11、son-Wesley 2009空閑與鼠標(biāo)的回調(diào)函數(shù)void spinCube()thetaaxis += 2.0;if( thetaaxis 360.0 ) thetaaxis -= 360.0;glutPostRedisplay();void mouse(GLint btn,GLint state,GLint x,GLint y)if(btn=GLUT_LEFT_BUTTON & state = GLUT_DOWN)axis = 0;if(btn=GLUT_MIDDLE_BUTTON & state = GLUT_DOWN) axis = 1;if(btn=GLUT_RIGHT_BUTTON

12、 & state = GLUT_DOWN) axis = 2;18Angel: Interactive Computer Graphics 5E Addison-Wesley 2009顯示回調(diào)函數(shù)void display(void)glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();glRotatef(theta0,1.0, 0.0, 0.0); glRotatef(theta1,0.0, 1.0, 0.0);glRotatef(theta2,0.0, 0.0, 1.0); colorcube(); glFlu

13、sh();glutSwapBuffers();注意:由于回調(diào)函數(shù)的參數(shù)形式是固定的,類似于theta和axis等變量必須定義為全局變量照相機(jī)信息在標(biāo)準(zhǔn)的形狀改變回調(diào)函數(shù)中定義19Angel: Interactive Computer Graphics 5E Addison-Wesley 2009模型視圖矩陣和投影矩陣在OpenGL中模型視圖矩陣可以用來(lái)定位照相機(jī)可以利用旋轉(zhuǎn)和平移,但通常采用gluLookat()會(huì)更簡(jiǎn)單建立對(duì)象模型投影矩陣用來(lái)定義視景體以及選擇照相機(jī)鏡頭雖然兩者有同樣的函數(shù)進(jìn)行處理,但應(yīng)用時(shí)必須非常仔細(xì),因?yàn)槔奂拥母淖兛偸怯页说紺TM上例如,用同樣的矩陣旋轉(zhuǎn)模型視圖矩陣和投影

14、矩陣并不是等價(jià)的操作。對(duì)模型視圖矩陣的左乘等價(jià)于對(duì)投影矩陣的右乘20Angel: Interactive Computer Graphics 5E Addison-Wesley 2009平滑旋轉(zhuǎn)從實(shí)用的觀點(diǎn)來(lái)看,經(jīng)常需要通過(guò)變換來(lái)平滑移動(dòng)和旋轉(zhuǎn)一個(gè)對(duì)象問(wèn)題:給出一個(gè)模型視圖矩陣序列M0, M1, , Mn使得當(dāng)把它們作用到一個(gè)或多個(gè)對(duì)象上時(shí),得到平滑的變換效果在定向?qū)ο髸r(shí),可以利用一個(gè)事實(shí),那就是任一旋轉(zhuǎn)對(duì)應(yīng)著球面上的大圓的一部分求出旋轉(zhuǎn)軸與角度教材:虛擬跟蹤球21Angel: Interactive Computer Graphics 5E Addison-Wesley 2009增量式旋轉(zhuǎn)考

15、慮兩種途徑對(duì)于一組旋轉(zhuǎn)矩陣R0, R1, , Rn, 求出每個(gè)的Euler角,再應(yīng)用Ri= Riz RiyRix不是很有效利用最終的位置確定旋轉(zhuǎn)軸與旋轉(zhuǎn)角度,再逐步增加這個(gè)角度四元數(shù)方法比上述兩種方法都有效22Angel: Interactive Computer Graphics 5E Addison-Wesley 2009四元數(shù)四元數(shù)是把復(fù)數(shù)從二維到四維的推廣有一個(gè)實(shí)部和三個(gè)虛部i,j, kq=q0+q1i+q2j+q3k=(q0, q) i2= j2= k2= ijk= -1向量q=q1i+q2j+q3k23Angel: Interactive Computer Graphics 5E

16、Addison-Wesley 2009四元數(shù)的運(yùn)算加法:q+q= (q0+q0, q+q) 乘法:qq = (q0q0 qq, q0q+q0q +qq) 共軛:q* = (q0, -q) 長(zhǎng)度:|q| = (q02+qq)1/2模:|q|2 = q02+|q|2 = qq*單位元:乘法(1, 0);加法(0, 0) 逆元:q-1= q* / |q|2 = (q0, -q) / |q|2 單位四元數(shù):|q| = 1,有q-1= q* a b = a2b3 a3b2, a3b1 a1b3, a1b2 a2b124Angel: Interactive Computer Graphics 5E Add

17、ison-Wesley 2009四元數(shù)與旋轉(zhuǎn)四元數(shù)的向量部分表示空間點(diǎn):p=(0, p) 定義:r=(cos/2, sin/2 v), 其中v為一個(gè)單位向量r是單位四元數(shù)p =r pr1也是一個(gè)點(diǎn),是點(diǎn)p繞方向v旋轉(zhuǎn)角后的位置固定點(diǎn)為原點(diǎn)25Angel: Interactive Computer Graphics 5E Addison-Wesley 2009四元數(shù)與旋轉(zhuǎn)p= 1 0 0v=0 1 0p1=cos(theta)*cos(theta)*pp2=sin(theta)*sin(theta)*dot(p,v)*vp3=2*sin(theta)*cos(theta)*cross(v,p)p

18、4=sin(theta)*sin(theta)*cross(cross(v,p),v)P=p1+p2+p3+p4;26Angel: Interactive Computer Graphics 5E Addison-Wesley 2009用四元數(shù)定義旋轉(zhuǎn)四元數(shù)可以表示在球面上的平滑旋轉(zhuǎn),而且非常有效。處理過(guò)程為模型視圖矩陣四元數(shù)用四元數(shù)進(jìn)行運(yùn)算四元數(shù)模型視圖矩陣27Angel: Interactive Computer Graphics 5E Addison-Wesley 2009四元數(shù)與旋轉(zhuǎn)四元數(shù)q= (w, x, y, z)對(duì)應(yīng)的旋轉(zhuǎn)矩陣為28Angel: Interactive Compu

19、ter Graphics 5E Addison-Wesley 2009界面交互計(jì)算機(jī)圖形學(xué)的一個(gè)主要問(wèn)題就是如何應(yīng)用二維的設(shè)備(如鼠標(biāo))控制三維的對(duì)象例如:如何構(gòu)造一個(gè)實(shí)例矩陣?替代方式虛擬跟蹤球三維輸入設(shè)備,如:空間球(spaceball)應(yīng)用屏幕區(qū)域:根據(jù)不同的鼠標(biāo)按鈕狀態(tài),利用到中心點(diǎn)的距離控制角度、位置、放縮29Angel: Interactive Computer Graphics 5E Addison-Wesley 2009物理跟蹤球跟蹤球是一個(gè)底朝上的鼠標(biāo)如果球和滾軸之間有小的摩擦力,我們可以推動(dòng)球使其保持滾動(dòng)產(chǎn)生連續(xù)的變化兩種可能的操作模式連續(xù)推動(dòng)或跟蹤手的運(yùn)動(dòng)旋轉(zhuǎn)30Ange

20、l: Interactive Computer Graphics 5E Addison-Wesley 2009鼠標(biāo)模擬跟蹤球問(wèn)題: 我們希望從鼠標(biāo)得到兩種行為模式我們用鼠標(biāo)模擬無(wú)摩擦(理想)跟蹤球一旦開始旋轉(zhuǎn),就會(huì)一直旋轉(zhuǎn),除非強(qiáng)迫停止分兩步解決:把跟蹤球位置映射到鼠標(biāo)位置用GLUT得到恰當(dāng)?shù)哪J?1Angel: Interactive Computer Graphics 5E Addison-Wesley 2009跟蹤球的標(biāo)架32Angel: Interactive Computer Graphics 5E Addison-Wesley 2009投影跟蹤球位置把球面上一點(diǎn)正交投影到y(tǒng)=0平面33Angel: Interactive Computer Graphics 5E Addison-Wesley 2009逆投影因?yàn)橥队捌矫婧蜕习肭蛎娑际嵌S曲面,我們可以逆向投影y=0平面上一點(diǎn)(x,0,z)對(duì)應(yīng)到半球面上的點(diǎn)(x,y,z),這里34Angel: Interactive Computer Graphics 5E Addison-Wesley 2009計(jì)算旋轉(zhuǎn)假設(shè)我們從鼠標(biāo)得到兩個(gè)點(diǎn)可以把它們投影到半球面上的點(diǎn)p1和p2這兩個(gè)點(diǎn)確定了球面上的一個(gè)大圓找到恰當(dāng)?shù)男D(zhuǎn)

溫馨提示

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