osg相機(基礎篇)

2021-09-24 19:49:06 字數 2258 閱讀 9111

在計算機的三維世界中,相機如同我們的眼睛,捕捉眼前的每一副畫面,反過來物體要能夠被相機在指定的距離和角度下**到,並通過螢幕畫素繪製出來。

在這個過程中,物體的三維空間座標需要經過好幾層矩陣變換,最終轉換到二維平面座標,並通過畫素呈現在螢幕中。我們將這幾層矩陣變換過程簡稱為mvpw矩陣變換

下面我們展開介紹mvpw具體內容 ~

模型(model)

mvpw中的m是模型頂點在三維場景中的位置。

一般情況下,模型在繪製過程中都是使用模型自身座標(通常稱為模型座標或者小座標),模型的頂點位置稱為pos,通過變換矩陣 matrix改變模型位置、姿態、大小,將模型放置在指定的三維場景中。這時候模型頂點在三維場景中的座標位置worldpos = pos * matrix。

觀察矩陣(viewmatrix)

mvpw中的v是觀察矩陣,作用是將世界座標轉為為相機座標。在相機座標系下,以相機作為參考,其位置為原點,world* viewmatrix可獲得模型頂點在相機座標下的位置。

osg::matrixd::lookat(eye,center,up)
其中eye是相機的世界座標位置,center是相機觀察的位置,up是相機向上向量。

我們可以通過建立座標軸來說明,在相機座標系下,eye與center的方向構建出的向量為前向量f,即y軸;f向量與up進行叉乘後得到右向量r,即x軸;r向量與f向量叉乘後的得到up向量u,即z軸。此時相機座標系的xyz軸就建立完成了。

圖1:相機座標軸

投影矩陣(projectmatrix)

mvpw中的p是投影矩陣(projectmatrix), 在計算機三維影象中,投影的作用是將三維座標資訊轉化到二維座標中。投影有兩種:透視投影和正交投影。

-正交投影可以讓視口中物體之間的距離在投影變化前後都保持不變,也可以按照實體原始比例繪製到螢幕中。

圖3:正交投影視景體(長方體)

例如,兩條平行線投影變換後仍然保持平行,不會出現遠處的物體變小近處的較大。

透視投影是在相機座標下裁剪一塊四稜錐區域,通過視口變換到乙個(-1,1)的正方體中,最終將正方體資訊投影到四稜錐的前面上。通過透視投影變換後的實體呈現出近處大遠處小效果。透視投影跟人的眼睛或相機鏡頭觀察到的效果是一致的。

圖4:透視投影視景體(四稜錐)

圖5:fovy, aspectratio, znear關係圖

其中當三維座標經過了mvp轉換後,還需要經過視窗變換,才能顯示在螢幕中。

視窗矩陣變換主要作用是將視口裁剪後的結果對映到螢幕中,通過viewport獲取螢幕顯示區域的大小,將幀緩衝區域內的資料轉變為能顯示在螢幕上的畫素。

當資料進行mvp矩陣轉換後,得到裁剪座標,在經過座標除以w之後(稱為透視除法),會得到標準化裝置座標(ndc),標準化裝置座標是乙個x、y和z值在-1.0到1.0的一小段空間。

任何落在範圍外的座標都會被丟棄/裁剪,不會顯示在你的螢幕上,最終將x、y分別於viewport中顯示的寬度、高度相乘,得到最終的螢幕座標。整個過程也是世界座標轉換為螢幕座標的過程!

圖7:標準化裝置座標

一起回顧

最後,讓我們一起回顧mvpw的整個過程:

m用來模型位置變換,調整模型位置,變換後的物體座標是全域性座標,也成為世界座標;

v是相機的視口變換,用來構建相機視口座標系,將物體全域性座標轉換為相機座標中;一般我們將模型變換與視口變換統稱為模型視口變換,即modelview;

p是投影變換,構建乙個裁剪的視景體,或長方體或四稜錐,對場景進行裁剪;

w是視窗變換,作用是將幀緩衝區域內的資料轉變為能顯示在螢幕上的畫素。

多相機座標轉換 osg相機(基礎篇)

恆歌科技 在計算機的三維世界中,相機如同我們的眼睛,捕捉眼前的每一副畫面,反過來物體要能夠被相機在指定的距離和角度下 到,並通過螢幕畫素繪製出來。在這個過程中,物體的三維空間座標需要經過好幾層矩陣變換,最終轉換到二維平面座標,並通過畫素呈現在螢幕中。我們將這幾層矩陣變換過程簡稱為mvpw矩陣變換。下...

osg 相機座標系

先看這個例子 include include include include int main int argc,char argv return 0 1 程式執行結果 將相機設定到世界座標系 0,0,12 的位置,向下看牛。同時,牛繞著x軸自傳。2 解說 相機座標系,和opengl的相機座標系一致...

OSG中相機引數的更改

修改相機引數時不知怎麼回事修改引數又無效了,蠻奇怪了,最後問題解決了,記錄一下.直接上 pragma comment lib,osg.lib pragma comment lib,osgdb.lib pragma comment lib,osgviewer.lib include osgviewer...