使用四元数沿球体表面移动

时间:2010-10-29 11:20:02

标签: math 3d quaternions

我正在编写3D游戏,其中用户控制第一人称相机,并且移动被约束到球体的内表面。我设法限制了运动,但我无法弄清楚如何使用四元数来管理相机方向。理想情况下,相机向上矢量应该沿着球体的法线指向其中心,用户应该能够自由地环顾四周 - 好像我们总是在球体的底部,无论他在哪里移动。

2 个答案:

答案 0 :(得分:5)

据推测,你有两个向量描述相机的定向。一个将是 V'up 描述哪个方向相对于相机方向向上,另一个将是 V'norm ,这将是相机是针对性的。您还将拥有一个位置p',您的相机位于某个位置。您可以定义一个规范的方向和位置,例如:

Vup = <0, 1, 0>
Vnorm = <0, 0, 1>
p = <0, -1, 0>

给定四元数旋转q,然后将旋转应用于这些向量以获取:

V'up = qVupq-1
V'norm = qVnormq-1
p' = qpq-1

在您的特定情况下,您可以定义q以逐步累积导致应用于相机的最终旋转的各种旋转。效果将是它看起来像你正在描述的。也就是说,您将相机移动到静态定位和定位的球体内,而不是将镜头移动到静态定位和定位的相机周围。

每个增量是通过围绕向量V = V'up x V'norm的某个角度θ的旋转来计算的。

答案 1 :(得分:1)

四元数通常用于避免自由空间运动中的万向节锁定(飞行模拟等)。在你的情况下,你实际上想要万向节效果,因为当它必须指向几乎笔直向上或向下时,被迫保持直立的相机将不可避免地表现得很奇怪。

您应该能够将相机的方向表示为指示相机指向方向的纬度/经度对。