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