1

使用 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

这让我感到困惑,因为两者的结果是相同的。因此,我想找出区别以及何时使用其中一种。

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

4

1 回答 1

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)and .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() 会改变旋转,而不管它现在在哪里

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

与标准角度方法相比,四元数具有许多优点;其中最明显的是避免云台锁定可以使用四元数的地方一定要使用它们。角度方法都是方便的方法,可以在需要时为您提供帮助。

于 2013-07-12T15:43:55.730 回答