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アップ。どうすればこれを変更できるのかわかりません。それが私の問題なのかどうかさえわかりません。