我需要一些数学相关的帮助。
我需要用鼠标旋转屏幕上的模型,但这种旋转还需要基于相机当前的偏航和俯仰。我已经完成了第一部分,但我不知道如何继续将我的滚动和俯仰转换为相对于相机的。目前,旋转仅在相机尚未旋转时才起作用(考虑到当前代码就是这样做的,这是可以预料的。)
另外,请注意,我的意思是滚动而不是偏航。我希望通过左右滑动鼠标来控制滚动。
我读过四元数可以解决问题,但作为一个通过示例学习的学习者,我一直无法弄清楚如何做到这一点。
这是我当前的代码(请注意,PI2 只是 Pi * 2):
float dx = (input.getMouseDX() * prefs.mouseSensitivity);
float dy = (input.getMouseDY() * prefs.mouseSensitivity);
double roll = rollAngle, pitch = pitchAngle;
roll = (roll+dx) % PI2;
if(roll < 0){
roll += PI2;
}
pitch += dy;
rollAngle = (float) yaw;
pitchAngle = (float) pitch;
此外,这里还有一个在所有角度上显示所需效果的 GIF(但该 GIF 是在非旋转相机上拍摄的,这是我提到它有效的唯一一点。)
最佳答案
我在访问了一些数学网站之后找到了解决方案,但没有找到。
对于将来遇到此问题的任何人,这里有一个基本的数学公式:
变量:
RPYToRot = Function to convert (roll, pitch, yaw) to rotation matrix
RotToRPY = Opposite of above
RCam = camera rotation (roll, pitch, yaw)
RPos = player rotation (roll, pitch, yaw)
公式本身是:
RNew = RotToRPY(RPYToRot(RPos)*Rcam)
这是我使用的代码:
if (!markedMa){
camMa.setFromEulerAngles((float) Math.toDegrees(-camera.getYaw()), (float) Math.toDegrees(camera.getPitch()), 0f);
markedMa = true;
}
float dx = (input.getMouseDX() * (prefs.mouseSensitivity * 5f));
float dy = (input.getMouseDY() * (prefs.mouseSensitivity * 5f));
utilMatrix.setFromEulerAngles(0f, -dy, -dx);
camMa.mul(utilMatrix);
plaMa.setFromEulerAngles((float) Math.toDegrees(trueYaw), (float) Math.toDegrees(pitch), (float) Math.toDegrees(roll));
plaMa.mul(camMa);
技巧是在模型上开始旋转时立即获取相机旋转(假设您锁定相机方向),并将其乘以每帧的鼠标移动,而不是自己重置相机旋转矩阵。
plaMa 拥有最终的转换,您可以将其应用于您的模型。
关于使用 LibGDX 相对于相机位置的 Java 旋转模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20036805/