1

回転メソッドを使用して 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

結果は両方で同じであるため、これは私にとって混乱を招きます。そのため、違いと、どちらをいつ使用するかを調べたいと思います。

私が読んでいる本では、最初の方法は相対的であり、クォータニオンを使用する 2 番目の方法は絶対的であると書かれていますが、それが何を意味するのかはまだわかりません。

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() の違い
ただし、使用している 2 つの関数は同等ではありません。実際には両方.rotate(angles)あります.rotate(quaternion) (ただし、.setLocalRotation()はクォータニオンでのみ使用できます).rotate(anything)したがって、質問の 2 番目の部分は、との違いは何ですか.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()は現在の場所に関係なく回転を変更します。

結論
オブジェクトに現在回転がない場合、2 つの関数は同じですが、オブジェクトが既に回転している場合は、「現在の回転と同様に」および「現在の回転の代わりに」と同等です。

クォータニオンには、標準の角度アプローチよりも多くの利点があります。最も明白なのは、ジンバル ロックを回避することです。クォータニオンを使用できる場合は、それらを使用してください。角度メソッドはすべて、必要な場合に役立つ便利なメソッドです。

于 2013-07-12T15:43:55.730 に答える