在我的Direct3D应用程序中,可以使用鼠标或箭头键移动相机。但是如果我在 LookAtLH 中硬编码(0,1,0)作为向上方向向量,则框架在相机的某些方向上变为空白。

我刚刚学会了沿着Y轴观察的难度,(0,1,0)不再像向上方向一样(看起来很明显?)。我正在考虑将这些特殊情况转换为其他方面。是否有更优雅的方式来处理这个问题?

有帮助吗?

解决方案

假设您可以计算向前指向的向量(您正在查看的位置 - 您的位置)和向右指向的向量(除非您可以滚动,否则始终位于XZ平面上)。将这两个向量归一化,然后向上向右x向右(其中x是叉积)。

一般情况下,您可以将偏航,俯仰和滚动插入旋转矩阵并旋转轴向量以向右,向上和向前移动,但我想这就是您使用LookAtLH来避免的。

请参阅 http://en.wikipedia.org/wiki/Rotation_matrix#The_3- dimensional_rotation_matricies

其他提示

处理此问题的优雅方法是使用单位四元数。四元数是4个值的向量,用于编码3D空间中的方向(不像某些文章所声称的那样是旋转),单位四元数是向量长度sqrt(x ^ 2 + y ^ 2 + z ^ 2 + w ^ 2)是1.0。有一组用于处理四元数的数学运算,类似于使用矩阵来编码旋转,四元数永远不能代表退化方向。当您需要将结果提供给GPU时,您可以自由地将四元数转换为3x3或4x4矩阵。

问题在于,当您移动相机时,您会在相机的向上方向上引入一点扭曲。通过强制相机在每次迭代时将自身重新定位在(0,1,0)矢量上,您实际上是旋转相机然后将相机的方向夹紧以保持在球体表面上,但是当您的相机击中时这个领域的极点没有好的方向来称呼“向上”。并且您的矩阵变为单数并且为您提供零大小的多边形(因此黑屏)。四元数能够通过这些极点进行插值,并且从另一侧出来就好了,随时为您提供有效的矩阵。你所要做的就是控制“扭曲”。

要测量这种扭曲,你应该阅读Ken Shoemake的文章“Fiber Bundle Twist Reduction”。在图形宝石4一书中,他展示了一种很好的方法来衡量这种积累的扭曲,以及如何在它令人反感时将其移除。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top