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

本文探讨了Direct3D中的左手笛卡尔坐标系与右手坐标系的区别,详细解释了camera视角变换原理,并对比了DirectX与OpenGL在坐标系转换、裁剪模式上的不同之处。

由于一开始接触的是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渲染任何坐标系的模型都不会再糊涂了吧。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值