使用LibGDX相对于相机位置的Java旋转模型

时间:2013-11-17 22:07:29

标签: java model rotation libgdx quaternions

我需要一些数学相关的帮助。

我需要用鼠标在屏幕上旋转模型,但这种旋转还需要基于相机的当前偏航和俯仰。我有第一部分,但我不知道如何继续改变我的滚动和音调相对于相机。现在,旋转仅在相机尚未旋转时才起作用(考虑到当前代码的作用,可以预期旋转。)

另外,请注意我的意思是滚动而不是偏航。我希望通过鼠标的左右滑动来控制滚动。

我已经读过四元数可以解决问题,但作为一个逐个学习的学习者,我无法弄清楚如何做到这一点。

这是我当前的代码(注意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是在非旋转相机上拍摄的,这是我提到的唯一有效点。)

enter image description here

1 个答案:

答案 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有您的最终转换,然后您可以使用它来应用于您的模型。