viewmatrix用於直接將world座標系下的座標轉換到camera座標系下。已知相機的座標系。還有相機在世界空間下的座標.就能夠求出viewmatrix。以下進行具體推導。
令uvn為相機座標系下的三個基,,對於乙個相機來說,它在開始的時候和世界座標系是重合的,使用者控制相機在世界空間中移動之後,相機的狀態能夠用兩個屬性來描寫敘述——朝向和位置。也就是說。有了這兩個屬性,乙個相機模型在世界中的狀態就確定了。
而這兩個屬性,我們用變換的理論來描寫敘述,就是旋轉和平移。
能夠想象,對於世界中的不論什麼乙個相機狀態,我們都能夠把它看成是:相機先環繞自身基原點旋轉一定的角度,然後平移到世界空間的某個地方。下圖展示了這個過程
圖一 . 相機的變換與逆變換
圖中,紅色是相機的基,而黑色是世界的基,也就是參考係。
小人是世界中的乙個物體。相機在移動之前,兩個基是重合的。當相機在螢幕中定位時。它首先會進行朝向的確定——旋轉。然後進行位置的確定——平移。圖中的rotation和translation兩步就是相機定位時所發生的變換。能夠看到相機相對於小人的運動。而當進行相機變換的時候,小人應該從世界基變換到相機的基裡面。
這樣,他應該進行乙個相機定位的逆定位。先逆平移小人和相機。然後再逆旋轉小人和相機。最後相機歸位,小人隨相機變到了相機空間。這是由inverse translation和inverse rotation兩個步驟完畢的。這兩個步驟就是相機變換。
如今我們推導這個變換。我們把關係寫出來。相機本身的變換c包含兩個元素
c = tr
當中t是平移變換,r是旋轉變換。而相機變換是相機本身變換的逆變換
這個c^-1就是我們要求出的相機變換。
當中t^-1非常easy求出,即
r^(-1)比較難求出,這裡用到了正交基一些知識,能夠參考下碰撞檢測之ray-cylinder檢測前面關於正交基的部分。
當相機變換進行完inverse translation這一步之後,相機的原點和世界原點就重合了,也就是處理完了關於平移的變換。接下來我們要做的是逆旋轉,而事實上逆旋轉的目的,就是要得到眼下世界座標中經過逆平移的小人在相機座標系中的座標。
由座標轉換公式
對於世界座標中的已經經過逆平移的座標v』,它在相機座標系r中的座標是v』』,而相機座標系就是
則相機變換的完整公式就是
當中v是小人在世界空間中的座標。v』』是小人在相機空間中的座標。則相機變換矩陣就是
常見的求viewmatrix的情況有三種。一種是用lookat函式。另外一種是相似fps遊戲中通過pitch和yaw來算,另一種是相似軌跡球的演算法。
最後的方法都是轉化為求出相機的座標系的基。
這裡參考是左手座標系,並且在相機空間,相機的forward是z軸的負方向。和unity還有opengl一致。
圖二 . 相機的左手座標系
例如以下圖,這樣的求法須要知道攝像機的位置 eye。乙個up向量(global),還有攝像機的觀察點at
圖三 . lookat函式模型
matrix4x4 lookat(const vector3& eye, const vector3& target, const vector3& up)算例
圖四 . lookat函式計算結果
//unity圖五 . unity中的計算結果transform.position = new vector3(1, 2, 3);
transform.lookat(new vector3(0, 10, 0), vector3.up);
debug.log(camera.main.worldtocameramatrix);
(貌似unity中的transform.lookat函式是直接改動的camera的rotation?)
通過之前的結論
如果原始的座標係為x-(1,0,0), y-(0,1,0), z(0,0,1),這個座標系經過乙個旋轉矩陣matrix旋轉之後,新的座標系就是這個旋轉矩陣的轉置三個列向量。
事實上這裡要求的僅僅是旋轉矩陣的轉置。
注意相機的z方向並非相機正對的方向,而是相機的背面。
matrix4x4 transform::fpsview(const vector3& eye, quaternion rotation)算例
//c++結果qdebug() << transform::fpsview(vector3(1,2,3), quaternion::euler(30, 45, 60));
圖六 . fpv函式計算結果
//unity圖七 . unity中執行結果transform.position = new vector3(1, 2, 3);
transform.rotation = quaternion.euler(30, 45, 60);
debug.log(camera.main.worldtocameramatrix);
understanding the view matrix -
tutorial 3 : matrices -
opengl transformation -
推導相機變換矩陣 -
具體解釋mvp矩陣之齊次座標和modelmatrix
具體解釋mvp矩陣之齊次座標和viewmatrix
具體解釋mvp矩陣之齊次座標和projectionmatrix
具體解釋協方差與協方差矩陣
協方差的定義 對於一般的分布,直接代入 e x 之類的就能夠計算出來了,但真給你乙個詳細數值的分布,要計算協方差矩陣,依據這個公式來計算,還真不easy反應過來。網上值得參考的資料也不多,這裡用乙個樣例說明協方差矩陣是怎麼計算出來的吧。記住,x y 是乙個列向量,它表示了每種情況下每乙個樣本可能出現...
STL之set具體解釋(二)
首先來看看set集合容器 set集合容器實現了紅黑樹的平衡二叉樹資料結構。在插入元素時它會自己主動調整二叉樹的排列,把該元素放到適當的位置,而且 保證左右子樹平衡。平衡二叉檢索樹採用中序遍歷演算法。對於set,vector,map等等,它們的前向迭代器定義是這種 以set為例 set iterato...
opengl es2 0之相機MVP矩陣
本文翻譯來自 在這篇文章中我們將討論3d世界中乙個非常重要的部分。你應該也知道,在我們的裝置螢幕後面的這個世界只是試圖重現人類眼睛的美麗和複雜性。為了做到這一點,我們使用照相機模擬現實世界中的人眼。為了構造攝像機,我們使用了數學方程式。在這篇文章中我們將討論背後的照相機和數學方程式,凸凹透鏡的區別,...