坐标变换理解
2016-05-06 11:01
197 查看
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
使用惯性坐标系(惯性坐标系是世界坐标系平移到物体坐标系的位置)可以简化物体-世界,世界-物体,或者说任何两个坐标系间的转换做一个中间的转换,使问题变得简单。使用嵌套坐标系(父坐标系-子坐标系-子坐标系)也可以分解问题,简化复杂的变换逻辑。其实把问题简单化思考的方法,不外乎实例化,拆分它,转换它,再组合转换抽象回来,就可以很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
相关文章推荐
- android缓存数据到本地放在哪儿
- Cocos2d-x-javaScript 的webSocket的代码
- 文件搜索命令
- A Simple Script for Deploying Code With Github’s WebHooks
- OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)
- 适配器基类--万能适配器(BaseAdapter)
- Git 命令小结
- 这朵玫瑰叫Jenny
- C++作业4-1
- Web 通信 之 长连接、长轮询(long polling)
- Android Fragment 你应该知道的一切
- 关于schedule_timeout
- 图片验证示例1
- OPENGL设备坐标系(dns)是左手坐标系,屏幕坐标系原点在左下角向上向右增加
- codeforces 670C Cinema
- chmod命令高级篇( SetUID与SetGID标识位)
- 汇编学习笔记
- Android Fragment 真正的完全解析(下)
- iOS之修改项目BUG之旅--(四)
- 1081. Rational Sum (20)