JMonkeyEngine旋转和四元数之间有什么区别?

时间:2013-07-11 09:19:04

标签: java 3d jmonkeyengine quaternions

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

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

这对我来说很困惑,因为两者的结果相同。所以我想找出差异以及何时使用其中一个。

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

1 个答案:

答案 0 :(得分:4)

使用四元数和使用欧拉角之间的差异
对于标题中的问题,使用四元数和角度表示之间没有功能差异,实际上.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) 都有({{1} }}仅适用于四元数)。因此,问题的第二部分是.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(); } 将对象(在其本地框架中)从现在的位置旋转,而.setLocalRotation()更改旋转,而不管它在何处现在

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

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