【问题标题】:Translating a quaternion camera at a fixed height在固定高度平移四元数相机
【发布时间】:2011-04-01 00:19:57
【问题描述】:

我有一个用 C# 编写的四元数相机(无耻地取自在线教程)。我正在尝试将相机在世界空间中的位置(表示为 Vector3)沿相机“面向”的方向平移。但是,我希望相机在 Y 轴上保持固定高度(假设相机永远不会“倒置”,因为它可能不会旋转到垂直向上或向下看 Y 轴)。

简单地说,我希望相机的行为方式类似于命令与征服等 RTS 游戏中的相机。向前按应该会使您“向上”移动地图,并保持在地形上方的恒定高度。下面给出的我的幼稚尝试是不够的,因为相机的速度是由相机俯视世界的角度决定的。

var Y = mPosition.Y;
mPosition += mInverseViewMatrix.Backward * amount;
mPosition.Y = Y;

在上面,mPosition 是代表世界位置的 Vector3。 mInverseViewMatrix 是视图矩阵的逆矩阵。

我正在使用 XNA 和 C#,但任何关于四元数和矢量操作的一般建议都可能有用。

【问题讨论】:

    标签: 3d xna geometry computational-geometry xna-4.0


    【解决方案1】:

    我通过两种方式处理了这个问题。

    1) 使用四元数旋转指向“向前”的单位向量,使其指向正确的方向。将向量的 y 分量清零。重新归一化向量。乘以速度并添加到当前位置。

    已编辑 2)制作四元数的副本。将四元数的 xz 分量清零。重新归一化四元数。通过四元数旋转单位向量,乘以速度,并添加到位置。旋转的四元数表示是修改后的轴角表示。因此,如果您将发生旋转的轴的“x”和“z”部分归零,那么剩下的唯一旋转就是“偏航”围绕 y 轴的旋转(假设“前进”与 z 对齐-轴)。

    【讨论】:

    • 我使用了您的第二个建议,效果很好。这似乎是一种间接的解决方案,但我肯定会接受一个不正确的解决方案。谢谢。
    • 我收回了这一点,我刚刚意识到这种转换在绕 Y 轴旋转时似乎不稳定。也许我做错了,任何指针? var orient = new Quaternion(new Vector3(0, mOrientation.Y, mOrientation.Z), mOrientation.W); orient.Normalize(); var vect = Vector3.Transform(Vector3.UnitX, Matrix.CreateFromQuaternion(orient)); // Vector3.UnitX * Matrix.CreateFromQuaternion(orient); mPosition += vect * 数量;
    • 糟糕。是的,您还需要将 z 归零,只留下 w 和 x。
    猜你喜欢
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    相关资源
    最近更新 更多