java - JMonkeyEngine 旋转和四元数有什么区别?

标签 java 3d jmonkeyengine quaternions

在 JMonkeyEngine 中使用 rotate 方法旋转几何有什么区别:

float r = FastMath.DEG_TO_RAD * 45f; // convert degrees to radians
geom.rotate(r, 0.0f, 0.0f); // rotate the geometry around the x-axis by 45 degrees

并使用四元数旋转几何体:

Quaternion roll045 = new Quaternion(); // create the quaternion
roll045.fromAngleAxis(45*FastMath.DEG_TO_RAD, Vector3f.UNIT_X); // supply angle and axis as arguments)
geom.setLocalRotation(roll045); // rotate the geometry around the x-axis by 45 degrees

这让我感到困惑,因为两者的结果相同。所以我想找出区别以及何时使用一个而不是另一个。

我正在阅读的书上说第一种方法是相对的,而使用四元数的第二种方法是绝对的,但我仍然不清楚这意味着什么。

最佳答案

使用四元数和使用欧拉角的区别
对于标题中的问题,使用四元数和角度表示在功能上没有区别,实际上 .rotate() 函数在内部是

public Spatial rotate(float xAngle, float yAngle, float zAngle) {
    TempVars vars = TempVars.get();
    Quaternion q = vars.quat1;
    q.fromAngles(xAngle, yAngle, zAngle);
    rotate(q);
    vars.release();

    return this;
}

换句话说,无论你直接使用四元数还是不使用四元数,你都在使用四元数。



.rotate() 和 .setLocalRotation() 的区别
但是您使用的两个函数并不等同,事实上.rotate(angles).rotate(quaternion ) (尽管 .setLocalRotation() 仅适用于四元数)。所以你问题的第二部分是 .rotate(anything).setLocalRotation(anything) 之间的区别是什么。再次查看源代码给了我们答案

public Spatial rotate(Quaternion rot) {
    this.localTransform.getRotation().multLocal(rot);
    setTransformRefresh();

    return this;
}


public void setLocalRotation(Quaternion quaternion) {
    localTransform.setRotation(quaternion);
    setTransformRefresh();
}

因此,.rotate() 将对象(在其局部框架中)旋转当前位置的量,而 .setLocalRotation() 更改旋转无论现在身在何处

结论
如果您的对象当前没有旋转,则这两个函数是相同的,但是如果对象已经旋转,则它们等效于“以及当前旋转”和“而不是当前旋转”。

与标准角度方法相比,四元数有很多优点;其中最明显的是避免 gimbal lock .在您可以使用四元数的地方确实使用它们。角度方法都是方便的方法,可以在您需要时为您提供帮助。

关于java - JMonkeyEngine 旋转和四元数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17589616/

相关文章:

通过 RTMP 共享用户桌面的 Java 解决方案

java - JackRabbit 在 WAS 上为我们的一个 REST 应用程序设置

java - 将 List 传递给 Set Constructor,过滤是否按顺序进行?

algorithm - 需要 3D 旋转算法

javascript - Three.js 透明度/差异

java - 如何在 jME3 中修改 Swing 对象?

java - Apache James 无法送达电子邮件

java - 在 libGDX 中,3D 对象是相互透视的

java - 在 Intellij IDEA 中设置 JMonkeyEngine

c++ - 旋转矩阵到四元数(以及返回)有什么问题?