我們都知道,opengl規定矩陣使用列主序儲存,即glloadmatrix等函式要求輸入的陣列是按列主序儲存的矩陣。然而,乙個很奇怪的事實是,osg中矩陣
儲存是使用的標準c二維陣列(行主序),並且也是直接將行主序儲存的矩陣元素作為引數傳遞給glloadmatrix呼叫的。
另外乙個奇怪的事實是,opengl規定的對頂點應用矩陣變換使用左乘(即把頂點座標看做列向量,變換寫做m*p),而osg規定使用右乘(即把頂點座標看
作行向量,變換寫做p*m)。
然而,這兩個奇怪的事實絕不是osg設計上的失誤,而是有意為之!
在了解osg的這一設計的目的及原理之前,先回憶一下矩陣運算的一些基礎知識。
我們知道,把乙個一維向量看做行向量與看做列向量,從幾何意義上來講是沒有差別的,但是,對它們進行相同的空間變換(平移、旋轉),所需要的變換矩
陣卻是不同的(它們互為轉置)。通常情況下,我們習慣把頂點座標看待成行向量,即矩陣變換為v*m,因為在此情況下的平移矩陣是我們所習慣看到的
而對於列向量的平移矩陣則是
然而,由於opengl規定對頂點的矩陣變換使用左乘,即頂點座標被看做列向量。
為了使引擎的使用者能夠面向形如
的平移矩陣,osg做了這樣的設計:
首先,由於在矩陣變換應用順序上與opengl使用了相反的規定(osg的右乘對opengl的左乘),導致osg計算得到的矩陣正好是opengl需要的矩陣的轉置;
然後,和在矩陣元素傳遞上再次使用了與opengl相反的規定(osg的行主序對opengl的列主序),由於對同乙個一維陣列按行主序解析與按列主序解析得到的
矩陣正好互為轉置,所以osg傳遞給opengl的矩陣被再一次轉置;兩次轉置相抵消,使得最終opengl收到的矩陣正是引擎呼叫者所理解的矩陣。
以上對osg設計動機的解釋純屬個人理解,重點在於對其計算邏輯正確性的推理。
接下來說一下osg中矩陣運算規則:
上文已經指出,osg矩陣變換使用如下公式:v' = v * m
其中,v是變換前的節點座標,m是變換矩陣,v'是變換後的節點座標,三者均為世界座標系下的表示。
設變換矩陣m由m1、m2兩個變換矩陣組合而成,即 m = m1 * m2,則 v'= v * m1 * m2,對應到osg節點樹結構,則是:mt2->mt1->geode。
對於變換幾何意義的理解,可以以從左向右(矩陣相乘)/從下向上(節點樹結構)的順序,此時每個變換都是以世界座標係為參考的;也可以以從右向左/從上向下的
順序理解,此時變換都是以模型座標系(變換過程中的臨時座標系)為參考的。
對於平移t、旋轉r、縮放s三種變換矩陣的組合,應該按如下順序:m = s * r * t
。變換矩陣與座標系的關係,已知變換矩陣
references links:
OSG 矩陣運算
我們都知道,opengl規定矩陣使用列主序儲存,即glloadmatrix等函式要求輸入的陣列是按列主序儲存的矩陣。然而,乙個很奇怪的事實是,osg中矩陣儲存是使用的標準c二維陣列 行主序 並且也是直接將行主序儲存的矩陣元素作為引數傳遞給glloadmatrix呼叫的。另外乙個奇怪的事實是,open...
矩陣運算 矩陣旋轉
以下不加證明地給出在世界座標系中,以座標點 0,0,0 為原點的旋轉矩陣 包含平移的線性變換稱作仿射變換,3d中的仿射變換不能用 3 x 3 矩陣表達,必須使用4 x 4矩陣 1.繞x座標軸旋轉 1 0 0 0 0 cos a sin a 0 0 sin a cos a 0 0 0 0 1 2.繞y...
Matlab矩陣與矩陣運算
1.矩陣的建立函式 特殊矩陣 a.矩陣轉置 inv a 矩陣求逆 sparse a 稀疏矩陣 full a 將稀疏矩陣轉換為普通矩陣 eye n n階單位矩陣 zeros m,n m n的零矩陣 ones m,n m n的元素全為1的矩陣 rand m,n m n的隨機矩陣,元素在0 1間均勻分布 ...