現在我們開始學習如何把三維物體投影到二維平面上,同時保持它的深度。通常的投影包括平行投影和透視投影:平行投影比較簡單,就是把頂點垂直的投向投影平面,常用在cad或者機械製圖中。另外一種投影是透視投影,這種投影能較好的使二維投影顯示立體感,因為人眼**物體符合透視原理,透視原理也是學美術的人的必修課程。最常見的透視原理表現形式就是三維世界的平行線在透視幾何中是相交的,它們的交點叫做滅點,比如我們觀察平行的馬路,在遠處會發覺它們越來越靠近,直至相交在一起。
本教程我們將產生投影變化矩陣,所謂投影矩陣,就是把視覺空間的frustum(視錐體)投影到乙個長方體中,這需要我們提供四個引數:
投影區域(四邊形)的寬高比。
攝像機觀察垂直視角的大小。
近z平面到視點的距離。
遠z平面到視點距離。
推導投影矩陣的過程見
最終的投影矩陣為:
其中ar為投影平面(四邊形)的寬高比,alpha為垂直觀察視角,nearz,farz為近z和遠z平面。
投影矩陣乘以頂點位置,這時得到的頂點座標就為裁剪空間,再經過透視除法後,就是所謂的歸一化裁剪空間。前面的教程中,我們沒有做任何投影變化,直接在裁剪空間定義頂點,進行操作。
主要變化**,增加了乙個初始化透視矩陣的函式,該函式會根據傳入的引數寬高比、垂直視角、近z平面和遠z平面值計算出透視矩陣。
void pipeline::initperspectiveproj(matrix4f& m) const>
定義了乙個結構來儲存透視投影引數。
struct m_persproj;
最終計算變化矩陣時候,會乘上投影矩陣,注意乘的順序,位置向量在最右邊,是列向量:
m_transformation = persprojtrans * translationtrans * rotatetrans * scaletrans;
在渲染函式中,我們增加了設定透視矩陣函式的呼叫
p.setperspectiveproj(30.0f, window_width, window_height, 1.0f, 1000.0f);
程式執行後的介面如下:
OpenGL 投影矩陣的推導
計算機顯示器是乙個2d平面。opengl渲染的3d場景必須以2d影象方式投影到計算機螢幕上。gl projection矩陣用於該投影變換。首先,它將所有定點資料從觀察座標轉換到裁減座標。接著,這些裁減座標通過除以w分量的方式轉換到歸一化裝置座標 ndc 本文主要推導正交投影矩陣和透視投影矩陣。注意n...
opengl教程翻譯 8縮放矩陣
背景知識 縮放矩陣相當簡單。它的目的要麼放大,要麼縮小物體的尺寸。你可以這麼使用它,例如當你想用相同的模型創造稍有出不同的物件 大的小的樹實踐上是一樣的 或者當你想在世界空間中把乙個物件的到小匹配到它的角色中時。例如上面的例子中你可能想在三個軸上都縮放頂點位置相同大小的頂點位置。然而,有些時候你可能...
投影矩陣備忘
投影矩陣 project matrix 本意是將不規則的檢視體 view volume 變換成乙個單位立方體,但投射到螢幕時,z被丟棄了,所以造成了2d投影的假象.注意這是錯覺,實際概念應該是投射到單位立方體空間,是空間投射的概念.需要注意的是,opengl最終投射到單位立方體 1,1,1 1,1,...