标签:
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
坐标变换理解
标签:
原文地址:http://blog.csdn.net/blues1021/article/details/51329928