记,是两个不同坐标系的基向量,他们之间的过渡矩阵为T。
即:
设点P在坐标系中的坐标为(x1,y1,z1),在中的坐标为(x2,y2,z2)。
则有:
--> *(x1,y1,z1)' = *T*(x2,y2,z2)' (这里的必然是可逆的矩阵)
--> (x1,y1,z1)' = T*(x2,y2,z2)' (这里的T也必然是可逆矩阵)
--> Inv(T)*(x1,y1,z1)' = (x2,y2,z2)' (Inv(T)代表T的逆矩阵)
上面的过程采用的是右手系,所以如果两个坐标系的过渡矩阵为T那么他们的坐标相差的就是Inv(T)。
而在DX中采用的是左手系,左手系和右手系就相差一个转置,所以上面的过程为:
T*' = '
--> (x1,y1,z1)*Inv(T) = (x2,y2,z2)
在DX中,从Object Space-->World Space-->View Space-->Clip Space,使用的D3DXMatrixXXX得到的Matrix都是Inv(T)这个矩阵,注意不是两个坐标系的过渡矩阵。
在进行两个坐标系之间的坐标变换的时候,只要找到那个过渡矩阵T就可以解决了。而求T主要就用
平移:将前一个坐标系的坐标原点移动到另一个坐标系的原点
旋转:当两个坐标系的原点对齐后,旋转移动过来的坐标系,使他们的x,y,z轴对齐
所以:
在右手系情况下是右乘基向量,T = 平移M*旋转M
在左手系情况下是左乘基向量,T = 旋转M*平移M
如果是单位基向量,即E矩阵。那么T = ,而如果是标准正交基,则InvT = T'。
这里举一个从World Space到View Space的变换过程(采用左手系)
World Space中的基向量为E。
Eye Position为(1,2,3)
Up向量为(1,0,0)
Right向量为(0,0,1)
Look向量为(0,1,0)
则有
|1, 0, 0| |0, 0, 1|
Trotate*(a1,a2,a3)' = Trotate * |0, 1, 0| = |1, 0, 0|
|0, 0, 1| |0, 1, 0|
在上面这个等式中是不能包含平移矩阵的,因为向量之间是没有位置关系的,只有方向。
而平移矩阵 = |1, 0, 0, 0|
|0, 1, 0, 0|
|0, 0, 1, 0|
|1, 2, 3, 1|
在3D中平移矩阵要在第四维来体现,所以这里的是4x4的矩阵。
T = 旋转矩阵*平移矩阵 = |0, 0, 1, 0| |1, 0, 0, 0|
|1, 0, 0, 0| * |0, 1, 0, 0|
|0, 1, 0, 0| |0, 0, 1, 0|
|0, 0, 0, 1| |1, 2, 3, 1|
Trotate是标准正交矩阵,所以Inv(Trotate) = Trotate'
而平移矩阵他的逆矩阵是在原来的方向反着平移的矩阵,所以就是
Inv(平移矩阵) = |1, 0, 0, 0|
|0, 1, 0, 0|
|0, 0, 1, 0|
|-1, -2, -3, 1|
而Inv(T) = Inv(
旋转矩阵*平移矩阵 ) = Inv(平移矩阵)*Inv(
旋转矩阵 )
= |0, 1, 0, 0|
|0, 0, 1, 0|
|1, 0, 0, 0|
|-3, -1, -2, 1|
验证:
World Space * Inv(T) View Space
(1, 2, 3, 1) (0, 0, 0, 1)
(1, 3, 4, 1) (1, 0, 1, 1)