3

Y軸が上、X軸が右、Z軸がこちらを向いている座標系に基づいた四元数があります。

このクォータニオンに基づいて、別のアプリケーション (C++) で文字を移動したいと考えています。座標系が同じであれば問題ありませんが、このアプリケーションでは異なる座標系が使用されます。Z は上、X は右、Y はモニターのトラフ (内側) です。

クォータニオンを単純に回転させて座標系を調整しようとしましたが、回転を試みるたびに、正しいように見えませんでした。

私の考えでは、何らかの基本変換が必要ですが、四元数でこれを行う方法がわかりません。四元数で基本変換を実行する方法を知っている人はいますか?

編集

クォータニオンには Eigen C++ ライブラリを使用します。ここに私が使用したクォータニオンがあります:

Quaternion<float> QX90( Eigen::AngleAxisf( M_PI /2.0, Eigen::Vector3f::UnitX() ) );
Quaternion<float> nQX90( Eigen::AngleAxisf( -M_PI /2.0, Eigen::Vector3f::UnitX() ) );

Quaternion<float> Qrshoulder = .... //the Quaternion in the Y up coordinate system

X軸を回転させてみました:

Qrshoulder=Qrshoulder*QX90; 
Qrshoulder=QX90*Qrshoulder;
Qrshoulder=Qrshoulder*nQX90;
Qrshoulder=nQX90*Qrshoulder;

これはうまくいきませんでした。他のいくつかの乗算も試しました。論理的に見えるすべての回転をほぼすべて試しました。私は混乱しています..これはクォータニオン乗算では実行できないようです

編集2

絶対四元数と階層四元数があります。Hierarchical Quaternions は、親ボーンから子への 3D 空間での回転量を提供します。絶対四元数は、乗算された階層ボーンの向きです。

一方で、アニメートしたいキャラクターには背後にエンジンがあり、すでにボーンが乗算されているため、階層的な回転を使用する必要があります。しかし問題は、階層回転を使用すると、Y 軸が常にボーンの方向になることです。

ノルノックの答えから私が試したこと:

Quaternion<float> QNX( Eigen::AngleAxisf( 0, Eigen::Vector3f(1,0,0) ) );

rot=(QNX*QX90*Qrshoulder).toRotationMatrix();
targetNode->setRotation( Eigen::Transform3f( rot ) );

これは、階層型でも絶対的な向きでも機能しませんでした。これは、私が得る四元数を説明する記事です: http://msdn.microsoft.com/en-us/library/hh973073.aspx

私が見逃していると思うのは、階層方向を使用すると、必要な正しい量の回転が得られますが、Y軸がボーンに沿っているため、座標系が完全に台無しになり、私のcolladaでは座標系が常にZアップ。どうすればこれを変更できるのかわかりません。それが私の問題なのかどうかさえわかりません。

4

2 に答える 2

2

あなたが試したローテーションを見せてもらえますか?負の X 軸を中心に 90 度回転した後の二次基底が元の基底であるように聞こえます。

これは、角度軸ベクトル [(PI / 2), 1、0、0]。元の四元数を行列形式に変換し、アフィン回転行列を連結することもできます。現時点では、sin/cos 項の順序を忘れています。

また、ベクトルと行列を乗算する順序にも注意してください。(v' = Rv) != (v' = vR)。

[編集 1]
問題は、クォータニオンには固有の利き手や特定の基底への結合がないということです。それらは、原点を基準にして定義された方向成分に関する運動の量です。さらに、以前のローテーションに関する明示的な情報は保存されません。

したがって、一方のコンテキストで Z 軸を中心に 35 度回転する表現である最終的な四元数は、他方のコンテキストでも Z 軸を中心に 35 度回転します。2 番目の基底は、元の基底から X を中心に回転しているため、これでうまくいくはずです。

その他の考慮事項:

あなたは肩に言及しましたが、これは階層構造ですか? もしそうなら、この特定のクォータニオンはそのリムの真の最終/グローバル クォータニオンですか、それとも別のローカル コンテキストを参照している (そして連結されている) のでしょうか?

他のアプリケーションでこのクォータニオンをどのようなコンテキストで実装していますか? 同じ階層構造の場合は、再帰レンダリングを開始する前に、この補正四元数で ModelView を変換してから、完了したら元に戻してください (またはマトリックス スタックを使用します)。

[編集 2]
QNX とは? 移動が関連付けられていない軸を定義します。ゼロまたは「空の」四元数を使用しようとしている場合、それは [w, x, y, z] = [1, 0, 0, 0] です。

クォータニオンの乗算は、ライブラリの実装で変更されていない限り、右 (基本回転) から左 (新しい回転) です。私はEigenをチェックしましたが、ドキュメントで物事を切り替えることは言及されていません.

また、すべての回転はオブジェクトとともにグローバル軸を変換するため、上で述べたように、階層モデルがレンダリングされる前に、この補正クォータニオン (QX90) をグローバル絶対回転に追加する必要があります。下記参照。

Identity Matrix (clean slate)             Rotations in effect: [ ]
  Rotation 1                                                   [1]
    Draw some object                                           [1]

Identity Matrix                                                [ ]
  Rotation Q (QX90)                                            [Q]
    Rotation A (hip)                                           [A*Q]
      Draw hip                                                 [A*Q]
      Rotation B (spine)                                       [B*A*Q]
        Draw spine                                             [B*A*Q]
        Rotation C (shoulder)                                  [C*B*A*Q]
          Draw shoulder                                        [C*B*A*Q]

あなたが投稿したMSDNガイドの反復構造とは対照的に、階層モデルのみを再帰的にレンダリングしました。それでも、これは回転コンポーネントに関するグローバル変換マトリックスの状態の背後にある考え方です。

于 2013-04-22T15:10:27.223 に答える