我正在编写一个 3D 游戏,其中用户控制第一人称相机,并且运动被限制在球体的内表面。我设法限制了运动,但我无法弄清楚如何使用四元数管理相机方向。理想情况下,相机向上矢量应该沿着球体的法线指向它的中心,并且用户应该能够自由地环顾四周——就好像我们总是在球体的底部,无论他移动到哪里。
问问题
1715 次
2 回答
5
大概你有两个向量描述相机的方向。一个是您描述相对于相机方向向上的方式,另一个是您的相机瞄准方向。您还将有一个位置,您的相机有时位于该位置。您定义一个规范的方向和位置,例如:V'up
V'norm
p'
V up = <0, 1, 0> V norm = <0, 0, 1> p = <0, -1, 0>
给定四元数旋转q
,然后将旋转应用于这些向量以获得:
V' up = q V up q -1 V' norm = q V norm q -1 p' = q p q -1
在您的特定情况下,您定义q
增量累积各种旋转,这些旋转会导致您应用于相机的最终旋转。效果将是它看起来像您所描述的那样。也就是说,您在静态定向和定位的球体内移动相机,而不是在静态定向和定位的相机周围移动球体。
每个增量都是通过围绕向量 旋转某个角度 θ 来计算的。V = V'up x V'norm
于 2010-10-29T14:41:37.867 回答
1
四元数通常用于避免自由空间运动(飞行模拟等)中的万向节锁定。在您的情况下,您实际上想要万向节效果,因为被迫保持直立的相机在几乎笔直向上或向下指向时将不可避免地表现出奇怪的行为。
您应该能够将相机的方向表示为仅表示相机指向的方向的纬度/经度对。
于 2010-10-29T11:33:59.350 回答