計算機圖形學:(4-4)幾何對象與變換-OpenGL變換_第1頁
計算機圖形學:(4-4)幾何對象與變換-OpenGL變換_第2頁
計算機圖形學:(4-4)幾何對象與變換-OpenGL變換_第3頁
計算機圖形學:(4-4)幾何對象與變換-OpenGL變換_第4頁
計算機圖形學:(4-4)幾何對象與變換-OpenGL變換_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

4、理每個矩陣7Angel: Interactive Computer Graphics 5E Addison-Wesley 2009OpenGL中的矩陣在OpenGL中矩陣是狀態(tài)的一部分有多種類型模型視圖(GL_MODELVIEW)投影(GL_PROJECTION)用于操作的單組函數(shù)選擇所操作的對象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)每個函數(shù)的參數(shù)還可以是d(double)類型9Angel: Interactive Computer Graphics 5E Addison-Wesley 2009示例固定點為(1.0, 2.0, 3.0), 繞z軸旋轉(zhuǎn)30glMatrixMode(GL_MODELVIEW);glLoadIdentity();/此命令不會把投影矩陣重設(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個元素的一維數(shù)組,按列定義了4x4矩陣在glMultMatrixf(m)中m右乘當前矩陣11Angel: Interactive Computer Graphics 5E Ad

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

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

9、對于模型視圖矩陣:double m16;glGetDoublev(GL_MODELVIEW_MATRIX,m);15Angel: Interactive Computer Graphics 5E Addison-Wesley 2009變換的應(yīng)用例如:應(yīng)用空閑函數(shù)旋轉(zhuǎn)立方體,鼠標函數(shù)改變旋轉(zhuǎn)的方向從一個畫立方體的程序開始(cube.c)立方體中心在原點各方向與坐標軸平行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空閑與鼠標的回調(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等變量必須定義為全局變量照相機信息在標準的形狀改變回調(diào)函數(shù)中定義19Angel: Interactive Computer Graphics 5E Addison-Wesley 2009模型視圖矩陣和投影矩陣在OpenGL中模型視圖矩陣可以用來定位照相機可以利用旋轉(zhuǎn)和平移,但通常采用gluLookat()會更簡單建立對象模型投影矩陣用來定義視景體以及選擇照相機鏡頭雖然兩者有同樣的函數(shù)進行處理,但應(yīng)用時必須非常仔細,因為累加的改變總是右乘到CTM上例如,用同樣的矩陣旋轉(zhuǎn)模型視圖矩陣和投影

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

15、慮兩種途徑對于一組旋轉(zhuǎn)矩陣R0, R1, , Rn, 求出每個的Euler角,再應(yīng)用Ri= Riz RiyRix不是很有效利用最終的位置確定旋轉(zhuǎn)軸與旋轉(zhuǎn)角度,再逐步增加這個角度四元數(shù)方法比上述兩種方法都有效22Angel: Interactive Computer Graphics 5E Addison-Wesley 2009四元數(shù)四元數(shù)是把復數(shù)從二維到四維的推廣有一個實部和三個虛部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ù)的運算加法:q+q= (q0+q0, q+q) 乘法:qq = (q0q0 qq, q0q+q0q +qq) 共軛:q* = (q0, -q) 長度:|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ù)的向量部分表示空間點:p=(0, p) 定義:r=(cos/2, sin/2 v), 其中v為一個單位向量r是單位四元數(shù)p =r pr1也是一個點,是點p繞方向v旋轉(zhuǎ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),而且非常有效。處理過程為模型視圖矩陣四元數(shù)用四元數(shù)進行運算四元數(shù)模型視圖矩陣27Angel: Interactive Computer Graphics 5E Addison-Wesley 2009四元數(shù)與旋轉(zhuǎn)四元數(shù)q= (w, x, y, z)對應(yīng)的旋轉(zhuǎn)矩陣為28Angel: Interactive Compu

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

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

溫馨提示

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

評論

0/150

提交評論