本文是分析,所谓的右手坐标系转换为左手坐标系需要的:
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中数据转换到左手坐标系的旋转矩阵。
为什么是这样? 渲染时候应该Z轴取反,Z取反得到顶点坐标,然后渲染时候取背面进行渲染,设置摄像机和投影变换为左手坐标系的就可以了。
(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中变成该四元数的逆了,因为旋转角度没变,旋转轴改变了。
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值需要翻转(如果摄像机位置恰当改变了那么则不需要)。
得到参考位置差别:还要注意因为视图坐标系z轴改变的原因,如果摄像机坐标系变了但是观察位置没有变,那么x值需要翻转(如果摄像机位置恰当改变了那么则不需要)。
拓展坐标系存在和转换的本质:
拓展坐标系存在和转换的本质:
左右手坐标系的本质是十字三维坐标系中6 * 4 * 2=48种坐标系中的因为叉乘定义的不同而得到的左手24种坐标系和右手的24中坐标系。二维中4 * 2 =8种因为可以从反面旋转平面的,所以可以用一种标准的笛卡尔十字坐标系来表示。3维中,因为不存在更多的一维来观察旋转了,所以不管怎么翻转旋转,都会得到两种不同的坐标体系,不进行强制调转式的变化(非规律旋转)那么是不可能从一个坐标系变换到一个坐标系的,所以需要坐标体系之间变换需要进行强制性的调转变换,例如z轴取反,z-y互换等。