左右手坐标系的转换

计算机3D图像相关技术的讨论

左右手坐标系的转换

帖子awakening3d » 2017年 9月 27日 15:43

3D 图形 API 里经常会有左右手两套坐标系,其之间的相互转换让人烦恼,刚做了相关工作,记录一下。

D3D里用的是左手系,x 轴向右,y 轴向上,z 轴向前。

现在假设有一个物理库,使用右手系,x 轴向右,y 轴向上,z 轴向后,得到其中某对象的矩阵 m,然后要在 D3D 里渲染对象,如何转换 m 呢?

首先,我们看到坐标系差别是 z 轴相反,那就先在矩阵上加个镜像:
代码: 全选
00,  01,  02,  03     >     00,  01, -02,  03
10,  11,  12,  13     >     10,  11, -12,  13
20,  21,  22,  23     >     20,  21, -22,  23
30,  31,  32,  33     >     30,  31, -32,  33

因为向量和矩阵相乘,其结果的 Z 值是由向量和矩阵第三列点积得出;所以很简单,就是把矩阵第三列所有元素取反。这样,在渲染里面可以看到,对象的位置和旋转都对了。但是模型网格本身被镜像了,正反面也互换。所以要得到正确的模型显示,还需要再处理一下。

我们可以设想在应用矩阵前把模型本身所有顶点的 Z 值取反,这样再应用矩阵的镜像效果,刚好镜像回来正确的模型;也就是在向量和矩阵相乘前先把 Z 元素取反,由乘法规则可知,和向量 Z 元素相关的是矩阵第三行,所以我们只要对矩阵第三行所有元素取反,就达到目的了:
代码: 全选
00,  01, -02,  03     >     00,  01, -02,  03
10,  11, -12,  13     >     10,  11, -12,  13
20,  21, -22,  23     >    -20, -21,  22, -23
30,  31, -32,  33     >     30,  31, -32,  33

这样转换后的 右手系矩阵 就可以在左手系里正确渲染了。
awakening3d
网站管理员
 
帖子: 141
注册: 2010年 10月 28日 17:39

回到 学习交流

在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客

cron