在OSG里用4*4矩陣表示坐標系,空間坐標系有三個軸X,Y,Z,那么表示坐標系的矩陣中各個數字的具體意義,以及怎樣建立局部坐標系就是本文所要說明的。
矩陣意義
矩陣的前三列表示局部坐標系的各個軸的方向,最后一行表示世界坐標系下原點在局部坐標系下的坐標。
X軸 Y軸 Z軸
a00 a01 a02 a03
a10 a11 a12 a13
a20 a21 a22 a23
世界原點所在位置 a30 a31 a32 a33
矩陣的最后一列一般是0 0 0 1,也就是說最終的矩陣只需要確定前三列的值就可以了:
X軸 Y軸 Z軸
a00 a01 a02 0
a10 a11 a12 0
a20 a21 a22 0
世界原點所在位置 a30 a31 a32 1
構建矩陣
如上圖所示,x,y,z是世界坐標系,A(1,0,0)、B(0,1,0)、C(0,0,1)三點確定了一個平面,OO’是平面的法線。
現在按以下要求建立坐標系:
以O’為局部坐標系原點
O’Z’為Z軸
X軸可以選擇平面上任意一條過O’的直線,如O’C
Y軸就是z’^x‘ (^表示向量叉乘)
按照以上要求,可通過以下步驟來構建表示此局部坐標系的矩陣。
1、確定軸方向
由ABC三點可求得O’的坐標為(1/3,1/3,1/3)。進一步求得三個軸的方向向量為:
x’(-1/3,-1/3,2/3)
y’(1/3,-1/3,0)
z’(1/3,1/3,1/3)
因此建立局部坐標系如下:
x軸 y軸 z軸
-1/3 1/3 1/3 0
-1/3 -1/3 1/3 0
2/3 0 1/3 0
0 0 0 1 原點所在位置
2、確定原點坐標
還需要確定世界坐標系原點在此坐標系下的坐標,由圖上可知,原點在z’軸的負方向,OO’的長度為√3/3,所以原點在局部坐標系的坐標為(0,0,- √3/3)
局部坐標系如下:
x軸 y軸 z軸
-1/3 1/3 1/3 0
-1/3 -1/3 1/3 0
2/3 0 1/3 0
0 0 -√3/3 1 原點所在位置
3、單位化
必須保證坐標系各個軸是單位向量,因此需要對每個軸單位化,最終的矩陣M如下:
x軸 y軸 z軸
-√6/6 √2/2 √3/3 0
-√6/6 -√2/2 √3/3 0
√6/3 0 √3/3 0
0 0 -√3/3 1 原點所在位置
4、補充說明
必須要注意一點,M是一個WorldToLocal的矩陣,也就是說它是將世界坐標換算到局部坐標的矩陣。
三維坐標在與矩陣相乘的時候,需要補充一個值,構成四維才能運算,補充的值就是1。可以驗證一下:
C點在世界坐標系下是(0,0,1),在局部坐標系下就是(|O’C|,0,0),其中C的長度是√6/3。
(0,0,1,1) * M = (√6/3,0,0)。
直接計算LocalToWorld矩陣
如果已經明確局部坐標系的X、Y、Z軸方向和原點位置,那么可以直接計算出局部坐標系。
此矩陣前三行表示局部坐標系的各個軸的方向,第四行表示的是局部坐標系的原點在世界坐標系中的位置。
X軸 a00 a01 a02 0
Y軸 a10 a11 a12 0
Z軸 a20 a21 a22 0
局部原點所在位置 a30 a31 a32 1
繼續用以上的例子來說明,X、Y、Z現已經明確,O’就是局部坐標系的原點,因此第四行就是O’坐標:
X軸 -√6/6 -√6/6 √6/3 0
Y軸 √2/2 √2/2 0 0
Z軸 √3/3 √3/3 √3/3 0
局部原點所在位置 1/3 1/3 1/3 1
可以驗證一下,C點坐標在局部坐標系下是(√6/3,0,0),補1構成四維,乘以這個矩陣:
(√6/3,0,0,1) * M = (0,0,1,1)
C點的世界坐標正是(0,0,1)。
直接計算LocalToWorld矩陣要比計算WorldToLocal矩陣更簡便一些,省去了確定原點的步驟,因此可用這種方法來快速建立局部坐標系。
特別需要說明的是,以上所說的矩陣都是在OSG的表示方式,OpenGL中的矩陣與OSG中的矩陣是轉置關系。