2008-10-31 26 views
1

在我的Direct3D应用程序中,可以使用鼠标或箭头键移动相机。但是,如果我在LookAtLH中将(0,1,0)硬编码为向上方向矢量,则该帧在相机的某些方向上变为空白。在相机不断移动时定义在Direct3D视图矩阵中

我刚刚学会了沿着Y轴看时,(0,1,0)不再作为向上方向(看起来很明显?)的难题。我正在考虑为这些特殊情况中的每一个切换我的向上方向。有没有更优雅的方式来处理这个问题?

回答

4

假设你可以计算一个向前指向的向量(你正在看的是 - 你的位置)和一个向右的向量(总是在XZ平面上,除非你可以滚动)。标准化这两个向量,然后向上x向右(其中x是交叉乘积)。一般来说,你可以插入你的偏航,俯仰和滚动到一个旋转矩阵,并旋转轴矢量来得到正确的,向上和向前的,但我想这就是你使用LookAtLH来避免的。

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

1

的优雅的方式来处理,这是使用单位四元。四元数是4值的矢量,其编码3D空间中的方向(不像某些文章断言那样旋转),并且单位四元数是其中矢量长度为sqrt(x^2 + y^2 + z^2 + w^2)是1.0。有一组数学运算用于处理四元数,类似于使用矩阵来编码旋转,四元数不能代表退化方向。当需要将结果反馈给GPU时,可以自由地将四元数转换为3x3或4x4矩阵。

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

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

+0

我目前使用的解决方案是这样的:i)最初定义为(0,1,0)或适合的东西并将其存储在向量中ii)当用户改变相机方向时,相应地旋转存储的矢量并且将其设置为新的向上矢量 – 2008-11-06 04:57:00