在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中的矩阵是转置关系。