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

标签 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

最佳答案

我在访问了一些数学网站之后找到了解决方案,但没有找到。

对于将来遇到此问题的任何人,这里有一个基本的数学公式:

变量:

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/

相关文章:

java - 避免在 JavaPairRDD Apache Spark 中进行 Group By

ruby-on-rails - Rails 分层建模 - 多个类别

html - Div 在 rotateY div 中始终面向屏幕

java - java中的旋转字符串数组

python - 如何在 PyQt5 中使用 slider 旋转图像,同时保持图像居中?

java - 使用Maven导入mahout时出错

java - 将动态参数值设置为Java反射的泛型方法

java - 我无法理解的小 Java 异常

ios - 抽象解析对象?

c# - 在 Web API 中重新验证模型