我需要一些数学相关的帮助。
我需要用鼠标在屏幕上旋转模型,但这种旋转还需要基于相机的当前偏航和俯仰。我有第一部分,但我不知道如何继续改变我的滚动和音调相对于相机。现在,旋转仅在相机尚未旋转时才起作用(考虑到当前代码的作用,可以预期旋转。)
另外,请注意我的意思是滚动而不是偏航。我希望通过鼠标的左右滑动来控制滚动。
我已经读过四元数可以解决问题,但作为一个逐个学习的学习者,我无法弄清楚如何做到这一点。
这是我当前的代码(注意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是在非旋转相机上拍摄的,这是我提到的唯一有效点。)
答案 0 :(得分:0)
我在访问了几个数学网站之后找到了解决方案。
对于未来有这个问题的人来说,这是一个基本的数学公式:
变量:
RPYToRot =将(滚动,俯仰,偏航)转换为旋转矩阵的函数
RotToRPY =与上述相反
RCam =相机旋转(滚动,俯仰,偏航)
RPos =球员旋转(滚动,俯仰,偏航)
公式本身是:
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有您的最终转换,然后您可以使用它来应用于您的模型。