关于OPENGL的各个变换的顺序
OPENGL中的各種坐標(biāo)變換是很讓人頭疼的,而且坐標(biāo)變換實(shí)質(zhì)是矩陣相乘,所以不搞清楚其順序就如同瞎子摸黑一般。一樣要講一下網(wǎng)絡(luò)上的各個(gè)“高人”文章的高深,拷貝粘帖的就不說了,不少文章其實(shí)都沒細(xì)到講述整個(gè)這幾個(gè)變換的實(shí)際順序,比方說哪個(gè)函數(shù)先哪個(gè)函數(shù)后。
1,在OPENGL的紅寶書里面,首先提出了全局固定坐標(biāo)系統(tǒng)和局部移動(dòng)坐標(biāo)系統(tǒng),這里這兩個(gè)坐標(biāo)系的代碼實(shí)際上是差不多的。區(qū)別在于,全局用的是多個(gè)矩陣相乘即glMultMatrixf函數(shù),而局部用的是模型變換函數(shù),包括glTranslate,glRotate,glScale等。因此全局中的多個(gè)矩陣相乘,是讓矩陣和頂點(diǎn)坐標(biāo)做左乘操作,其矩陣相乘的前后順序和代碼的順序相反;局部中的模型變換函數(shù),是對(duì)模型坐標(biāo)系的操作,例如glRotate旋轉(zhuǎn)的不是模型上某個(gè)頂點(diǎn)的坐標(biāo),而是模型局部坐標(biāo)系,這點(diǎn)是必須要搞清楚的。但是你去找高手的文章,這種低級(jí)入門概念是找不到的
2,另外一個(gè)低級(jí)入門概念,就是glMatrixMode函數(shù)所承載的參數(shù)GL_MODELVIEW和GL_PROJECTION。紅寶書中明確指出,GL_PROJECTION對(duì)應(yīng)的是投影變換,實(shí)際是裁剪空間區(qū)域,將指定區(qū)域外的物體去除,所以一般后面跟glPerspective或者glFrustum函數(shù)
(frustum n. (平) 截頭體;截(頭)錐體;);
相對(duì)的GL_MODELVIEW參數(shù)對(duì)應(yīng)的是視圖模型變換,注意是“視圖變換”+“模型變換”,也就是說在指定了這個(gè)參數(shù)之后,才能執(zhí)行1中說的全局矩陣相乘和局部模型變換函數(shù),另外gluLookAt函數(shù),也必須在這個(gè)參數(shù)之后
3,“在進(jìn)行任何模型變換之前調(diào)用視圖變換”-- 這是紅寶書上的原話,就是說在執(zhí)行g(shù)lRotate函數(shù)前,必須先調(diào)用gluLookAt函數(shù)。這就讓人非常費(fèi)解了,因?yàn)榧t寶書的例子代碼上,gluLookAt函數(shù)都是放在reshape函數(shù)中,而glRotate函數(shù)一般都放在display中,并且在主函數(shù)中,reshape函數(shù)調(diào)用是寫在display函數(shù)之前的呀。這就要涉及到另外一個(gè)概念,就是無論是reshape函數(shù)還是display函數(shù),都是用回調(diào)函數(shù)的方式。相當(dāng)與WIN編程中的消息響應(yīng)函數(shù)。reshape函數(shù)是響應(yīng)窗口的變化,display函數(shù)是響應(yīng)畫圖,而一個(gè)opengl函數(shù)的生命是從創(chuàng)建窗口-》窗口中繪圖。因此實(shí)際上,reshape函數(shù)的調(diào)用是在display之前!這樣子,glMatrixMode–>gluLookAt–>glRotate的順序就和紅寶書所述的一致了!
(注:gluLookAt用來定義觀察者(相機(jī))的狀態(tài),包括觀察者在世界坐標(biāo)系中所處的位置、看向世界坐標(biāo)系中的方向(可以理解為眼睛所看向的方向)、觀察者頭部的朝向(可以在一個(gè)平面上360°旋轉(zhuǎn))。)
另外當(dāng)理解了整個(gè)函數(shù)的前后順序后,就可以靈活的放置相關(guān)函數(shù),比方說gluLookAt函數(shù)完全也可以放在display函數(shù)中,但是關(guān)鍵你要知道這么做所帶來的變化,而不是局限與紅寶書或者網(wǎng)絡(luò)上的所謂“自然而然”或者“應(yīng)該”。
總結(jié)
以上是生活随笔為你收集整理的关于OPENGL的各个变换的顺序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 改变博客字体和颜色
- 下一篇: OpenGL交互——菜单控制(基础教程)