關於OSG中各種變換的理解
最近學習OSG到第7章觀察我們的世界,與之前學習的OpenGL有一些區別,當然學OpenGL時就一直不太懂各種座標系以及變換。看了很久,現將內容整理如下。內容來自《OpenGL程式設計指南》+《OpenSceneGraph三維渲染引擎設計與實踐》
一、檢視基礎知識
計算機圖形學的要點就是建立三維物體的二維影象,因為要在螢幕上顯示,所以必須是二維的。我理解就是要讓螢幕裡的東西看起來是三維的。
但無須太早考慮如何在平面的二維螢幕上顯示最終影象,要儘量在三維空間裡想象物體的形狀。
三維世界與螢幕畫素的變換可以與照相機拍照過程類比:
(1)設定相機位置:視點變換,即觀察者是從什麼方向以及位置來觀察物體的。
在OpenGL中是通過gluLookAt()函式來確定檢視變換,這個函式的引數表示照相機的位置,朝向,以及那個方向是up方向
gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz)
eye:代表了相機的位置
center代表了視線方向上任意一點,由此和eye的座標確定了相機瞄準的哪個位置。
up:表示哪個方向是朝上的,也就是相機是正著拿還是反著拿。
在OSG中,我們使用osg::Camera節點來實現,視點變換矩陣又稱為觀察矩陣。Camera類儲存大量的相機設定引數,如視口、投影矩陣、和背景顏色等。
(2)調整物體位置:模型變換,即選定模型位置,對場景進行安排。
對應openGL是各種transform/scal/rotate,比如物體移動旋轉縮放等
在OSG中,通過使用MatrixTransform類來進行物體的平移旋轉縮放等。
(3)選擇鏡頭,調整焦距:投影變換,景物投射到二維底片的過程,這裡就是把模型投射到螢幕的過程。
對應openGL就是gluPerspective/glOrtho等
在OSG中的實現就靠Camera類裡的方法來定義了。
(4)沖洗照片:視口變換,將投影變換的結構反映到指定螢幕視窗
二、OSG中的座標系
世界座標系:即物體在那個虛擬的三維空間的位置,與OpenGL相同採用右手座標系,但不同的是
OpenGL中:X向右,Y向上,Z向外
OSG中:X向右,Y向裡,Z向上
相機座標系(眼座標系):(n,u,v)以眼睛為原點,
n:從參考點center指向視點eye的向量,相當與世界座標系的Z軸。所以說從視點看向物體的方向是n負方向。
u:視點up方向和n的叉積,相當於X軸
v:是n與u的叉積,相當於Y軸
三、OSG中的模型變換
osg::Transform繼承於osg::Group類,是其他所有變換類的基類。
設定空間變換節點的方法
1、直接設定空間變換矩陣的值:osg::MatrixTransform setMatrix(const Matrix& mat); const Matrix& getMatrix() const
2、直接設定變換的平移、旋轉和縮放值:osg::PositionAttitudeTransform
注意,模型變換是在模型座標,物體座標下進行的。
當需要依次執行物體的平移、旋轉和縮放操作時,不同的操作順序會直接導致不同的運算結果,所以需要遵循SRT(Scale/Rotate/Translate)原則。
osg中繼承自Transform的空間變換節點還有DOFTransform,AutoTransform,Bone等。
四、OSG中的視點變換
與模型變換相對應,可以採用視點變換改變觀察點的位置和方向,即改變照相機的位置和拍攝角度,從而改變最終的拍照結果。總結模型變換和視點變換,改變觀察點的位置與方向和改變物體本身的位置和方向具有等效性。
經過模型視點變換後可以將場景從世界座標系轉換到相機座標系。
在實際程式設計中不用去計算相機座標系,只要知道視點位置,視點方向以及up方向就可以確定一個相機座標系。
OSG中使用osg::Camera節點來實現,也就是相機節點。相機節點的功能:實現視點變換,構建觀察的投影矩陣和視窗矩陣,併合併為MVPW矩陣,實現三維場景向二維平面的對映並通過觀察矩陣、投影矩陣和視窗矩陣的不斷變化最終在計算機螢幕實現三維瀏覽和互動漫遊需求。
五、OSG中的投影變換
投影變換相當於拍照時通過選擇鏡頭和調整焦距等,將景物投射到二維底片的過程。投影變換的目的是產生一個視景體。
視景體有兩個作用:
1、決定一個物體如何對映到螢幕(透視投影:稜臺裝視景體,又稱視錐體;正投影:立方體,平行視景體)
2、決定哪些物體(或物體的某一部分)被裁減到最終的影象之外。
透視投影:離照相機近的物體大,離照相機遠的物體小。
正投影:物體和照相機之間的距離不影響它看上去的實際大小。
六、OSG中的視口變換
將投影變換得到的結果反映到指定的螢幕視窗上去,場景最終變換到了視窗座標系中。
總結:在OSG中以上的變化除了模型變換之外都可以由Camera類來實現。它保留了大量的相機設定引數,視口,投影矩陣,背景顏色。多個Camera節點可以共享一個子節點書結構,也就是說多臺相機可以從不同角度以不同的方式拍攝同一個物體。