OSG 矩陣運算

2022-05-19 22:07:29 字數 1572 閱讀 7446

我們都知道,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

變換矩陣與座標系的關係,已知變換矩陣

,則變換矩陣對應的座標系的三個座標軸為

OSG矩陣運算

我們都知道,opengl規定矩陣使用列主序儲存,即glloadmatrix等函式要求輸入的陣列是按列主序儲存的矩陣。然而,乙個很奇怪的事實是,osg中矩陣 儲存是使用的標準c二維陣列 行主序 並且也是直接將行主序儲存的矩陣元素作為引數傳遞給glloadmatrix呼叫的。另外乙個奇怪的事實是,ope...

矩陣運算 矩陣旋轉

以下不加證明地給出在世界座標系中,以座標點 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間均勻分布 ...