坐标变换理解

来源:互联网 发布:摇骰子的软件 编辑:程序博客网 时间:2024/05/12 14:13
1.简化变换的思想
使用惯性坐标系(惯性坐标系是世界坐标系平移到物体坐标系的位置)可以简化物体-世界,世界-物体,或者说任何两个坐标系间的转换做一个中间的转换,使问题变得简单。使用嵌套坐标系(父坐标系-子坐标系-子坐标系)也可以分解问题,简化复杂的变换逻辑。其实把问题简单化思考的方法,不外乎实例化,拆分它,转换它,再组合转换抽象回来,就可以很elegant的解决问题了。
很多物体间的方位和运动,需要在同一个坐标系中才能进行,以及渲染管道中本身要求多坐标系间转换来实现渲染

2.物体变换和坐标系变换的联系区别:
物体进行变换(例如把物体坐标系当做世界坐标系而不变,那么物体进行世界坐标系看到的要求进行旋转平移变换),等价于相反的顺序相反的量变换物体坐标系(例如把物体定住不变,那么需要坐标系进行相反的先相反方向平移相反方向旋转的变换)。其实变换了坐标系也会将坐标内所有的物体重新计算位置, 只是有时候那种更加合适那么使用那种变换,一般的是思考问题时是变换物体,但是实际中是变换物体坐标系(假定物体不变),因为变换坐标系更加方便处理多个坐标系间的变换,最终物体只需要重新计算位置一次

3.嵌套坐标系,针对坐标系间的双向变换:
物体到世界先进行缩放(前后嵌套的改变轴大小受轴走向和原点影响)旋转(改变轴走向受原点影响)后进行平移(改变原点,不受轴大小和轴走向影响),世界到物体先进行相反的平移后进行相反的旋转,其它坐标系间相互转换也符合该规律。相反的顺序主要是因为矩阵的组合变换求逆的要求

4.实例: 
D3DXMatrixLookAtLH函数体现了世界-观察坐标系的转换:
D3DXVECTOR3 position(0.0f, 0.0f, -5.0f);//camera在世界坐标系中的位置向量
 D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);//target是camera需要平移到的且旋转所在的点,可以是原点,也 可以是其它观察点
 D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);//定义向上的方向,一般是[0,1,0]
    D3DXMATRIX V;
 // V是world-to-view空间的变换矩阵,内部会计算世界坐标系到观察坐标系的变换(物体假设不变),
 // 其实新的坐标系下所有物体的位置时重新计算了的。
 D3DXMatrixLookAtLH(&V, &position, &target, &up);
  Device->SetTransform(D3DTS_VIEW, &V);//设置变换的状态,实际变换时,摄像机和摄像机内的物体会被一起变换。

返回的新坐标系是:

zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)

    
 xaxis.x           yaxis.x           zaxis.x          0
 xaxis.y           yaxis.y           zaxis.y          0
 xaxis.z           yaxis.z           zaxis.z          0
-dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  1



0 0