不同基下的坐标变换

3248阅读 0评论2012-02-01 新手来鸟
分类:

在3D中流水线中,在几何部分,主要就是从不同坐标系之间坐标变换,这里主要介绍坐标变换的理论。
,是两个不同坐标系的基向量,他们之间的过渡矩阵为T。
即:
*T =
设点P在坐标系中的坐标为(x1,y1,z1),在中的坐标为(x2,y2,z2)。
则有:
*(x1,y1,z1)' = *(x2,y2,z2)'                        (注:(x1,y1,z1)'代表转置)
-->    *(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主要就用
*T = 这个公式。而通常在3D中两个坐标系的基向量都是标准正交基,所以他们相差的就是一个平移和旋转,注意是先平移,再旋转。
平移:将前一个坐标系的坐标原点移动到另一个坐标系的原点
旋转:当两个坐标系的原点对齐后,旋转移动过来的坐标系,使他们的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)
上一篇:服务器存储空间不足,无法处理此命令。 ID 2019 或 2020
下一篇:配置wpa