何为左手坐标系(LH)和右手坐标系(RH)

来源:互联网 发布:qt淘宝刷到单流程图 编辑:程序博客网 时间:2024/04/29 20:50

由于一开始接触的是direct 3d的左手笛卡尔坐标系,养成了一种惯性思维,认为无论哪种坐标系,camera就应该沿着z轴的正向看出去,因此怎么也理解不了D3DXMatrixLookAtRH中为什么zaxis = normal(Eye - At)。现在终于明白了,如果把我们的眼睛是camera,在左手坐标系中我们看到的是z轴的正向,在右手坐标系中我们看到的是z轴的负向,我们看到的东西自然在我们前方,而z轴的正向指向我们脑后,因此zaxis = normal(Eye - At)。
值得一提的是无论在哪种坐标系中,旋转,位移,缩放三种变换矩阵的形式是一致的。
在左手坐标系中,从三角形的正向看去顶点是顺时针方向画出的(左手拇指朝向自己,四指弯曲的方向),因此dx的cull render state的默认值为D3DCULL_CCW即裁减逆时针画出的三角形,因为这些三角形是背朝camera的。


下面说一下两个坐标系下的变换矩阵
世界变换在两个坐标系下是一样的。view变换前面已经说过,zaxis求法不同。值得一提的是projection变换。无论在哪种坐标系中projection变换都是z坐标变换为0到1的深度信息(归一化后),越接近1说明深度越大。所以不管3d模型是在哪种坐标系的工具中创建的,经过其相应的mvp变换后的形式都是一样的。举个例子,一个“深度”为1的点在LH的建模系统中的坐标为(0,0,1),而在RH的建模系统中的坐标则为(0,0,-1)。而这两个点在参数相同的LH和RH mvp变换矩阵变换后的形式则是一样的。
也就是说如果我们不考虑dx和opengl使用的默认的变换矩阵的话,这两个所谓使用不同笛卡儿坐标系的api的区别仅仅在于默认的cull mode不同,dx是ccw,opengl是cw。明白了这一点,使用任何一种api渲染任何坐标系的模型都不会再糊涂了吧。 

原创粉丝点击