在學(xué)習(xí)opengl過(guò)程中。我是用了《交互式的計(jì)算機(jī)圖形學(xué) 自頂向下的分析》 這本書(shū)著實(shí)不錯(cuò)。是一本理論兼opengl實(shí)踐的圖形學(xué)教程。
在學(xué)習(xí)上,我總會(huì)是雜亂無(wú)章的學(xué)。為什么呢。我一般是在需要某個(gè)理論的時(shí)候才會(huì)去深究理論內(nèi)部的各種詳細(xì)機(jī)制,當(dāng)然前提必須是你對(duì)這方面知識(shí)必須有一點(diǎn)的了解,不需要了解的足夠深入。其實(shí)我想這也是讀書(shū)的一種方法吧。對(duì)于看書(shū)我向來(lái)先很粗糙的瀏覽整書(shū)一遍,大概就只看一些概念,了解這書(shū)的主要內(nèi)容 方向等。第二遍則是詳細(xì)的理解內(nèi)容,某些時(shí)候有些內(nèi)容都是很有之后才有心去看的。
其實(shí)今天在總結(jié)這個(gè)的時(shí)候,并不是在用opengl而是在使用osg設(shè)計(jì)一個(gè)項(xiàng)目人物汽車車等漫游類《可能應(yīng)用在手機(jī),汽車導(dǎo)航上》的時(shí)候,想起總結(jié)這的。我其實(shí)是想畫(huà)些圖來(lái)寫(xiě)這份總結(jié)可能會(huì)更容易理解的.然而實(shí)在懶...
在圖形學(xué)的顯示流程:
三維圖形->模型視圖變換->投影變換->三維裁剪->視口->屏幕圖形顯示
三維->二維的變換,總的來(lái)理解只是三維的物體在一系列的變換之后決定了屏幕上某些像素位置的顏色值。最后這些顏色組成了一幅圖畫(huà)。就是我們所看到得最終屏幕二維圖形了。
在大概了解這種流程之后,模型視圖變換 無(wú)疑將成為決定我們所將看到的圖像的輪廓。
模型視圖變換 應(yīng)該來(lái)講是包含兩個(gè)變換的:模型變換,視圖變換。為什么將他們合在一起呢? 在照相機(jī)成像系統(tǒng)中 若固定相機(jī)不動(dòng)移動(dòng)模型會(huì) 等價(jià)于 固定模型不動(dòng)移動(dòng)相機(jī)。
考究如下內(nèi)容:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); //當(dāng)前矩陣設(shè)置為單位矩陣
glRotatef(45.0f,0.0,0.0,1.0); //按[0.0,0.0,1.0]為軸旋轉(zhuǎn)45度
glTranslatef(2.0,2.0,2.0); // 平移至 [2.0,2.0,2.0]
glBegin(...); // 畫(huà)某些東西
...
...
...
glEnd();
有兩種方式理解:一種是局部坐標(biāo)系的理解,一種是全局坐標(biāo)系的理解。
如果按照上面那些內(nèi)容從上到下的理解的方式就是局部坐標(biāo)系的理解。opengl變換上的實(shí)現(xiàn)其實(shí)是個(gè)矩陣的乘法。按照局部坐標(biāo)系的理解 上面代碼的變換是按照這樣的順序執(zhí)行的:
先將局部坐標(biāo)系繞z軸旋轉(zhuǎn)45度,在將局部坐標(biāo)系的原點(diǎn)平移至[2.0,2.0,2.0],然后在局部坐標(biāo)系內(nèi)畫(huà)物體。
假設(shè) 旋轉(zhuǎn)步驟的矩陣為R,平移部分的矩陣為T 當(dāng)前矩陣為C。
new_C=old_C*R*T 這是一個(gè)矩陣右乘操作
理論上來(lái)講 這就是一個(gè)坐標(biāo)系的變換過(guò)程,R*T 這個(gè)矩陣其實(shí)就是將原先的坐標(biāo)系變換到現(xiàn)在的坐標(biāo)系,這個(gè)時(shí)候原先坐標(biāo)系的點(diǎn)p將變換成p1,p1=(R*T)*p。
而按照全局坐標(biāo)系的理解,它的變換過(guò)程則是相反的,這也是相當(dāng)?shù)暮美斫獾?在當(dāng)前世界坐標(biāo)系中畫(huà)好該物體之后,我必須將它移動(dòng)到正確的位置。那必須得先平移物體到[2.0,2.0,2.0],然后將物體繞z軸旋轉(zhuǎn)45度。這是一個(gè)相反的變換過(guò)程,然而這個(gè)與前面的是等價(jià)的 為什么?
考慮世界坐標(biāo)系下點(diǎn)p,經(jīng)過(guò)平移操作后 p11=T*p; 在經(jīng)過(guò)旋轉(zhuǎn)操作后 p1=R*P11=R*(T*p) 這是矩陣的一個(gè)左乘操作 先變換的在后面. 所以說(shuō)new_C=(old_c*(R*(T))) 左乘 所以說(shuō)這是一個(gè)等價(jià)的過(guò)程.
一般來(lái)將,我們考慮的時(shí)候總是世界坐標(biāo)系考慮旋轉(zhuǎn)平移等操作的.所以在寫(xiě)變換的時(shí)候最好的方式就是將 變換步驟一直左乘,而代碼中則按左乘后結(jié)果矩陣的順序?qū)懘a。
其次在理解以上的變換過(guò)程中模型變換的原理,我們可以很好的理解gluLookAt(eye,center,up)的視圖變換的過(guò)程,現(xiàn)在只考慮模型不動(dòng),照相機(jī)移動(dòng)的過(guò)程,且是在全局坐標(biāo)系下的移動(dòng)過(guò)程.
opengl默認(rèn)照相機(jī)框架 是視點(diǎn)在原點(diǎn) y軸為向上方向 z軸負(fù)方向?yàn)橐暰€方向
gluLookAt的目的在于使得視點(diǎn)移動(dòng)到eye位置 并看向center。
則gluLookAt的過(guò)程先平移至eye,而center->eye(center指向eye)則為z方向設(shè)為z(Zx,Zy,Zz),Up方向?yàn)閥軸方向,y,z的叉積則為x軸方向.則只需將它們都旋轉(zhuǎn)到位就行了
所以這個(gè)時(shí)候模型變換矩陣就為《相對(duì)于模型來(lái)講 相機(jī)移動(dòng)到eye等價(jià)于模型移動(dòng)到-eye.
|Xx Xy Xz 0| |1 0 0 -eyex|
|Yx Yy Yz 0| * |0 1 0 -eyey|
|Zx Zy Zz 0| |0 0 1 -eyez|
|0 0 0 1| |0 0 0 1 |
posted on 2009-07-14 21:38
米游 閱讀(773)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
OpenGL/OSG