我正在编写一种机制,允许用户在球体表面周围移动。球面上的位置当前存储为theta
和phi
,其中theta
是当前位置的z轴和xz投影之间的角度(即围绕y轴的旋转),并且phi
是从y轴到该位置的角度。我解释得很差,但实际上theta = yaw
,phi = pitch
Vector3 position = new Vector3(0,0,1);
position.X = (float)Math.Sin(phi) * (float)Math.Sin(theta);
position.Y = (float)Math.Sin(phi) * (float)Math.Cos(theta);
position.Z = (float)Math.Cos(phi);
position *= r;
我相信这是正确的,但是我可能是错的。我需要能够在半径为的世界空间的起点处围绕球体表面在任意伪二维方向上移动r
。例如,握持区W应相对于玩家的方向在球体上方向上移动。
我相信我应该使用四元数来表示球体上的位置/方向,但是我想不出正确的方法。球形几何不是我的强项。
本质上,我需要填写以下内容:
public void Move(Direction dir)
{
switch (dir)
{
case Direction.Left:
// update quaternion to rotate left
break;
case Direction.Right:
// update quaternion to rotate right
break;
case Direction.Up:
// update quaternion to rotate upward
break;
case Direction.Down:
// update quaternion to rotate downward
break;
}
}
(1,1,1)
握住左手的玩家将围绕球体旋转,经过(~1.2,0,~-1.2)
,然后(-1,-1,-1)
,然后再(~-1.2,0,~1.2)
返回(1,1,1)
。
theta
和phi
更新您的职位,那么会使您的问题变得不必要地复杂。简单地计算每帧(Vector3.Transorm
围绕其中一个(偏航)不变)的2个旋转轴会容易得多。这将简化您的问题,但会导致您与phi
&断开连接theta
。