左右手坐标系区别和联系

本文是分析,所谓的右手坐标系转换为左手坐标系需要的:

z轴取反;x轴取反(或者改变摄像机位置); 渲染绕序改变,其中的进一步的原因。

参考文章:

https://msdn.microsoft.com/en-us/library/bb204853%28VS.85%29.aspx

http://blog.csdn.net/augusdi/article/details/20450691

一、三角形网格数据

1.三角网格顶点数据改变

记得左手坐标系中摄像机坐标系是z轴正方西向里的,右手坐标系中摄像机坐标系是z轴负方西向里的,所以:

1)经典:右手坐标系转换为左手的时候需要三角网格数据z轴翻转

2)美术软件中:3DS MAX中却要y-z相互翻转

例如:

仔 细分析一下上述过程,我们面临的问题其实可分为两个层面,一个是骨骼计算层面,而另一个则是模型绘制层面。真正正确的做法是:不能将两者混为一谈,必须对 其过程进行严格区分,即,计算时不应该考虑绘制时所面临左右手系相关的问题,反之亦然。

3ds max中数据转换到左手坐标系的旋转矩阵。

(1 0 0 0 )
(0 0 1 0 )
(0 1 0 0 )
(0 0 0 1)

为什么是这样? 渲染时候应该Z轴取反,Z取反得到顶点坐标,然后渲染时候取背面进行渲染,设置摄像机和投影变换为左手坐标系的就可以了。
因为这里绘制的时候从3DS Max的右手坐标系( y朝里z朝上 )转换为左手坐标系的,刚好max中看到的三角网格数据转换为了D3D中的网格数据。

3)观察位置导致的正反-摄像机位置改变或者x值翻转

还要注意因为视图坐标系z轴改变的原因,如果摄像机坐标系变了但是观察位置没有变,那么x值需要翻转(如果摄像机位置恰当改变了那么则不需要)。

2.渲染时候,三角网格索引数据改变

渲染时候因为平面的判断,左手坐标系中是顺时针为正面,右手坐标系中逆时针为正面。

3.渲染时候,三角网格UV坐标系

如果绘制的顺序正面改变了,那么UV坐标也是要和索引缓存一样改变的。

二、绕序和正面-叉积和旋转数据的变换改变

4.叉积向量和旋转数据的变化

向量叉积方西会改变,旋转方西会改变;所以之前存放的法向量因为顶点改变了需要计算下,选择矩阵或四元数要改变。
例如:
A. 在左手系下,旋转轴向量为n顺时钟旋转t,则有:
q=[cos(t/2)  sin(t/2)n]
q=
[cos(t/2)  sin(t/2)nx  sin(t/2)ny  sin(t/2)nz]
q=
[w x y z]
B. 在右手系下,旋转轴向量为n,逆时钟旋转t,则有:
q=[cos(t/2)  sin(t/2)n]
q=
[cos(t/2)  sin(t/2)nx  sin(t/2)ny  sin(t/2)nz]
q=
[w x y z]
可以发现,唯一的区别在于,左右手系下角度t的旋转定义是相反的。Quarternion的四个分量,后面x/y/z三个分量在不同的坐标系下应该符号互反
也就是3DS MAX中存储的四元数,转换到D3D中变成该四元数的逆了,因为旋转角度没变,旋转轴改变了。

三、视图和透视投影坐标系差别

5.视图坐标系中差异

本地和世界坐标系中三角变换即可,而视图坐标系需要注意右手中定义是eye-at为z轴且往-z方向渲染,左手则at-eye为z轴且往z轴方向渲染,的可能需要改变下; 透视投影中OGL右手坐标系是将z放置到了[-1,1],D3D中右手坐标系是将z放置到了[0,1]。

得到参考位置差别:还要注意因为视图坐标系z轴改变的原因,如果摄像机坐标系变了但是观察位置没有变,那么x值需要翻转(如果摄像机位置恰当改变了那么则不需要)。

拓展坐标系存在和转换的本质:

左右手坐标系的本质是十字三维坐标系中6 * 4 * 2=48种坐标系中的因为叉乘定义的不同而得到的左手24种坐标系和右手的24中坐标系。二维中4 * 2 =8种因为可以从反面旋转平面的,所以可以用一种标准的笛卡尔十字坐标系来表示。3维中,因为不存在更多的一维来观察旋转了,所以不管怎么翻转旋转,都会得到两种不同的坐标体系,不进行强制调转式的变化(非规律旋转)那么是不可能从一个坐标系变换到一个坐标系的,所以需要坐标体系之间变换需要进行强制性的调转变换,例如z轴取反,z-y互换等。

阅读更多
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/blues1021。 https://blog.csdn.net/Blues1021/article/details/47382215
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭