我有一个用C#编写的四元数相机(无耻地从在线教程中获取)。我正试图将摄像机在世界空间中的位置转换为摄像机“朝向”的方向,该空间表示为Vector3。但是,我希望相机在Y轴上保持固定的高度(假设相机永远不会“倒置”,因为它可能无法旋转过去垂直向上或向下看Y轴)。
简单地说,我希望相机的行为与RTS游戏中的相机类似,例如Command&征服。向前按可以让你“向上”移动地图,在地形上方保持恒定的高度。下面给出的天真尝试是不够的,因为摄像机的速度取决于摄像机俯视世界的角度。
var Y = mPosition.Y;
mPosition += mInverseViewMatrix.Backward * amount;
mPosition.Y = Y;
在上面,mPosition是表示世界位置的Vector3。 mInverseViewMatrix是视图矩阵的反转。
我正在使用XNA和C#,但是关于四元数和矢量操作的任何一般建议都可能有用。
答案 0 :(得分:1)
我已经用两种方式解决了这个问题。
1)使用四元数旋转指向“向前”的单位矢量,使其指向适当的方向。清零向量的 y 组件。重新标准化矢量。乘以速度并加到当前位置。
被修改 2)制作四元数的副本。将四元数的 x 和 z 组件清零。重新规范四元数。通过四元数旋转单位向量,乘以速度,然后添加到位置。旋转的四元数表示是修改的轴角表示。因此,如果你将旋转发生的轴的'x'和'z'部分清零,那么剩下的唯一旋转就是围绕y轴旋转'偏转'(假设'向前'与z对齐轴)。