3

(おそらく、これは数学スタック交換に適していますか?)

私は骨で構成されたチェーンを持っています。各ボーンには、先端と尾のある があります。次のコードは、指定された回転で先端がどこにあるかを計算し、次のリンクをチェーンの位置に適切に設定します。

    // Quaternion is a hand-rolled class that works correctly (as far as I can tell.)
    Quaternion quat = new Quaternion(getRotationAngleDegrees(), getRotation());

    // figure out where the tip will be after applying the rotation
    Vector3f rotatedTip = quat.applyRotationTo(tip);

    // set the next bone's tail to be at this one's tip
    updateNextPosFrom(rotatedTip);

これは、オブジェクトの座標系の原点を中心に回転が発生する場合に機能します。しかし、オブジェクト内の他の任意の点を中心に回転させたい場合はどうすればよいでしょうか? 四元数の変換方法がわかりません。それを行う最良の方法は何ですか?

(JOGL / OpenGLを使用しています。)

4

5 に答える 5

5

デュアル クォータニオンは、厳密な空間変換 (回転と平行移動の組み合わせ) を表現するのに役立ちます。

双対数 (クリフォード代数の 1 つ、d = a + eb で、a、b は実数で、e はゼロに等しくないが e^2 = 0) に基づいて、双対四元数 U + e V は、 U は単位方向の四元数、V は基準点を中心としたモーメントです。このように、デュアル クォータニオン ラインは、プルッカー ラインに非常によく似ています。

クォータニオン変換 QVQ* (Q* は Q のクォータニオン共役) を使用して単位ベクトル クォータニオン V を点を中心に回転させますが、同様のデュアル クォータニオン形式を使用して、スクリュー変換を直線化するために使用できます (軸に沿った平行移動と組み合わせた軸)。

任意の剛体 2D 変換を点を中心とした回転に解決できるのと同様に、任意の剛体 3D 変換をねじに解決できます。

このようなパワーと表現力については、デュアル クォータニオン参照は薄いので、ウィキペディアの記事から始めることをお勧めします。

于 2012-11-28T17:16:02.687 に答える
4

通常、クォータニオンは回転のみを表すために使用されます。翻訳を表すこともできません。

クォータニオンを回転行列に変換し、それを標準の OpenGL 4x4 行列の適切な部分に挿入し、それを平行移動と組み合わせて、任意の点を中心に回転する必要があります。

4x4 rotation matrix:
  [ r r r 0 ]
  [ r r r 0 ]  <- the r's are the 3x3 rotation matrix from the wiki article
  [ r r r 0 ]
  [ 0 0 0 1 ]
于 2010-10-21T21:41:42.273 に答える
4

クォータニオンは特に回転係数を処理するために使用されますが、移動はまったく含まれません。

通常、この状況では、「ボーン」の長さに基づいてポイントに回転を適用しますが、原点を中心にします。その後、ポストローテーションを空間内の適切な位置に変換できます。

于 2010-10-21T17:12:53.740 に答える
3

順運動学に関するウィキペディアのページは、この論文を指しています:均質変換とロボット運動学の紹介

于 2010-10-21T17:32:00.120 に答える