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

2021-10-12 21:38:37 字數 2693 閱讀 4214

恆歌科技

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

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

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

模型(model)

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

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

觀察矩陣(viewmatrix)

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

投影矩陣(projectmatrix)

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

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

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

fovy——相機的角度大小,視角小就是焦距大(長焦),視角大就是焦距小(廣角);

aspect——實際視窗的縱橫比,即width(視窗寬度)/ height(視窗高度);

znear——近處裁面,如果物體的位置到相機距離小於近裁剪面,該物體會被相機裁剪掉;

zfar——遠處的裁面,如果物體的位置到相機距離大於遠裁剪面,該物體會被相機裁剪掉。

視窗矩陣變化(windows)

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

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

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

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

一起回顧

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

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

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

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

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

到此,mvpw的矩陣變換已經完成,

我們以此作為相機基礎篇的開端!

以後我們會結合freexearth產品應用為大家帶了更好的作品~

多相機座標轉換 相機標定及座標系變換

slam系統需要多種感測器支援,通常市場上常見的就是camera感測器,例如單目攝像頭,雙目攝像頭,rgb d相機等等。不論是深度相機,紅外相機,還是rgb相機,都是需要標定的,每乙個相機的內參都是固定的,相機標定也是產品落地必須做的乙個工程化步驟。多個相機需要對每個相機分別標定。相機矯正上,比較常...

osg 相機座標系

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

ARkit相機座標系轉換

arkit預設的座標系是右手系,但它的z軸是指向拍攝者的,也就是和相機鏡頭朝向相反,這給我們利用arkit獲取的資料進行後續處理產生了困難,因為像openmvs或openmvg中相機z軸朝向都是和相機拍攝方向相同 在openmvg的github上找到了這樣乙個issue,裡面的解決方法僅供參考 ca...