我正在编写3D游戏,其中用户控制第一人称相机,并且移动被约束到球体的内表面。我设法限制了运动,但我无法弄清楚如何使用四元数来管理相机方向。理想情况下,相机向上矢量应该沿着球体的法线指向其中心,用户应该能够自由地环顾四周 - 好像我们总是在球体的底部,无论他在哪里移动。
答案 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)
四元数通常用于避免自由空间运动中的万向节锁定(飞行模拟等)。在你的情况下,你实际上想要万向节效果,因为当它必须指向几乎笔直向上或向下时,被迫保持直立的相机将不可避免地表现得很奇怪。
您应该能够将相机的方向表示为指示相机指向方向的纬度/经度对。