在相机不断移动时在Direct3D视图矩阵中定义

时间:2008-10-31 09:55:00

标签: graphics geometry direct3d

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

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

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

为了测量这种扭曲你应该阅读Ken Shoemake的文章“Fiber Gems 4”中的文章“Fiber Bundle Twist Reduction”。他展示了一种测量这种累积扭曲的好方法,以及如何在它令人反感时将其删除。