我正在使用 OpenGL(具体来说是 LWJGL 绑定)用 Java 编写游戏。每个实体,包括相机,都有一个代表它的旋转的四元数。我已经想出了如何将四元数应用于当前的 OpenGL 矩阵并且一切都旋转得很好。我遇到的问题是让相机随鼠标旋转。
现在,每一帧,游戏都会抓取鼠标在一个轴上移动的量,然后将这个量应用到四元数上以进行相机旋转。这是旋转四元数的代码,我会发布它,因为我认为这是问题所在(尽管我对这类东西总是错的):
public void rotateX(float amount){
Quaternion rot = new Quaternion(1.0f, 0.0f, 0.0f, (float)Math.toRadians(amount));
Quaternion.mul(rot, rotation, rotation);
rotation.normalise();
}
该方法应该围绕 X 轴旋转四元数。'rotation' 是代表实体旋转的四元数。“数量”是我想要旋转四元数的数量(也就是鼠标移动的数量)。'rot' 是沿 X 轴的归一化向量,其 aw 值转换为弧度(我想这里的目标是给它一个角度 - 比如 10 度 - 并让它沿着给定轴旋转四元数角度)。使用 Quaternion.mul 获取新的四元数,将其乘以旋转四元数,然后将结果存储为旋转四元数。我不知道标准化是否必要,因为“rot”是正常的,“rotation”应该已经标准化了。
rotateY 和 rotateZ 方法做同样的事情,除了改变 'rot' 的向量(y 为 0.0, 1.0, 0.0 和 z 为 0.0, 0.0, 1.0)。
当游戏开始并且相机向下看负 Z 轴时,代码似乎可以正常工作。您可以在 Y 轴上一直旋转或一直围绕 X 轴旋转。但是,一旦您尝试在不向下看 Z 轴的情况下旋转相机,一切都会变得非常糟糕(我什至无法描述它,它的旋转非常奇怪)。
我的最终目标是在没有向上矢量的空间中控制一艘船。因此,当您在 Y 轴上移动鼠标时,无论船处于什么角度,它都会改变船的俯仰角(沿 X 轴旋转)。同样,当您在 X 轴上移动鼠标时,它会改变偏航角(沿 Y 轴的旋转)。我可能会以错误的方式解决这个问题,我可能只需要朝着正确的方向推动(或推动)。
如果您需要有关任何事情的更多详细信息(我的渲染是如何完成的,我正在尝试做的任何其他数学运算)只要问我就会提出来。当我使用欧拉角时,我明白了一切(这显然是 3D 应用程序开发的一大禁忌……希望有人能在我花很多时间让它们工作之前告诉我),但只要我切换到四元数,我很快就进入了我的脑海。在过去的几个月里,我一直在玩这个代码并阅读四元数试图让它工作,但我还没有真正得到任何地方:'(
非常非常令人沮丧...开始后悔尝试用 3D 制作东西>_<