質問

であり、既存のアルゴリズムに変換するクォータニオンを表現した回転をオイラー角の表現?回転のためのオイラーの表現ができる任意の組み合わxyz、xzy,yxz,yzx,zxy,zyx).などの見アルゴリズムを固定した回転(通常はNASAか、銀行、ロール条約だけでなく任意に回転す。

また、複数のオイラー角の表現を単一方向ので、この結果は曖昧なものです。ことが可能(オリエンテーションをも 有効な, ではできない場合には、ユーザは今後さらに詳しいものがあった場合アルゴリズムを回転限界(の自由度の限界各自由度)を考慮し、成果のに最も良識あるオイラー表現に対す。

思この問題(う)が存在する可能性が指摘されて、IKた剛体キネマティクスのドメイン.


解決: 私が実現ことが明らかにし、この問題を解決する以下の健Shoemakeのアルゴリズムからグラフィックジェムがもらえます。私の答えを自分で解決しなければならない問題が発生しまくできない場合があり明らかにはしなかった。の回答を、以下によります。


で明らかに-かに変換する方法からクォータニオンのいわゆる"Tait-Bryan'表現していたんですが、それをたまた呼び出しの"NASA'約に従います。この回転(仮にこの条約のZ軸)のzxy.いが必要なアルゴリズム すべての 回転。

その溶液は、zxyめの変換を求めることができるからではの変換のその他の回転です。思いつくろうと思いましたがより包括的ソリューション.る場合には、驚いているんを見つけることができ、既存ソリューションがあります。

また、このかは別問わず、変換を想定して知られる回転るコース)を選択 一つ オイラーの表現がないと言う事実であります。例えば、回転順yxzの表現(0,0,180)及び(180,180,0)が同等であるという利回り同一の非平衡ダイナミクス).はしてもらえると助かりますプロジェクトへの協賛を始めを使用してソリューションを制限の自由度?ようになIKと剛体キネマティクス?すなわち上の例があった場合のみ自由度のZ軸に対して第二の表現が無視できません。


って追跡され、今年一年の論文できるアルゴリズムに このpdf がん告白だから、その論理や数学の学習をします。確かにある他のソリューションが?は任意の回転を順んで珍しい?確かに主要な3Dパッケージできる骨格のアニメとクォータニオンの補間(マヤ、Max、ブレンダーなどにおけるこの問題なのか。

役に立ちましたか?

解決

このようなクラシックの場合は古い技術を見落とし-から受けることになってしまい掘り出しのコピーをグラフィックジェムIVからガレージにはこのような健Shoemakeなアルゴリズムに変換するオイラー角度 任意の 回転、も回答ものその他のご質問になれます。Hoorayます。私も投票で最氏Shoemakeの回答および報酬た評判。

思の推薦をもとオイラー角にはコピーのグラフィックジェムIVから地域の図書館および読の開始ページ222しています。では明確で簡潔な説明の問題を読み上げています。


ここでの有用なリンクしていまから- http://www.cgafaq.info/wiki/Euler_angles_from_matrix -り組んでおり、その一環として同一のシステムとしてShoemake;は、全24組の回転において符号化された、これまたすばらしい。パラメータ内軸、パリティの繰り返し、フレームとのでき削減のアルゴリズムから24日の場合2.関連するすべてのwiki全般のなかったのだ---。

にリンクが壊れた こちらの 他のコピーを"ピオイラー角度から回転行列 ".

他のヒント

右手直交座標系のZ軸を指し、い:

struct Quaternion
{
    double w, x, y, z;
};

void GetEulerAngles(Quaternion q, double& yaw, double& pitch, double& roll)
{
    const double w2 = q.w*q.w;
    const double x2 = q.x*q.x;
    const double y2 = q.y*q.y;
    const double z2 = q.z*q.z;
    const double unitLength = w2 + x2 + y2 + z2;    // Normalised == 1, otherwise correction divisor.
    const double abcd = q.w*q.x + q.y*q.z;
    const double eps = 1e-7;    // TODO: pick from your math lib instead of hardcoding.
    const double pi = 3.14159265358979323846;   // TODO: pick from your math lib instead of hardcoding.
    if (abcd > (0.5-eps)*unitLength)
    {
        yaw = 2 * atan2(q.y, q.w);
        pitch = pi;
        roll = 0;
    }
    else if (abcd < (-0.5+eps)*unitLength)
    {
        yaw = -2 * ::atan2(q.y, q.w);
        pitch = -pi;
        roll = 0;
    }
    else
    {
        const double adbc = q.w*q.z - q.x*q.y;
        const double acbd = q.w*q.y - q.x*q.z;
        yaw = ::atan2(2*adbc, 1 - 2*(z2+x2));
        pitch = ::asin(2*abcd/unitLength);
        roll = ::atan2(2*acbd, 1 - 2*(y2+x2));
    }
}

って数日間に同様の溶液またこのウェブサイトをアルゴリズムを変換する,四元数を任意のオイラー、Tait-Bryan回転!

こちらのリンク: http://bediyap.com/programming/convert-quaternion-to-euler-rotations/

このコード:

///////////////////////////////
// Quaternion to Euler
///////////////////////////////
enum RotSeq{zyx, zyz, zxy, zxz, yxz, yxy, yzx, yzy, xyz, xyx, xzy,xzx};

void twoaxisrot(double r11, double r12, double r21, double r31, double r32, double res[]){
  res[0] = atan2( r11, r12 );
  res[1] = acos ( r21 );
  res[2] = atan2( r31, r32 );
}

void threeaxisrot(double r11, double r12, double r21, double r31, double r32, double res[]){
  res[0] = atan2( r31, r32 );
  res[1] = asin ( r21 );
  res[2] = atan2( r11, r12 );
}

void quaternion2Euler(const Quaternion& q, double res[], RotSeq rotSeq)
{
    switch(rotSeq){
    case zyx:
      threeaxisrot( 2*(q.x*q.y + q.w*q.z),
                     q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z,
                    -2*(q.x*q.z - q.w*q.y),
                     2*(q.y*q.z + q.w*q.x),
                     q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z,
                     res);
      break;

    case zyz:
      twoaxisrot( 2*(q.y*q.z - q.w*q.x),
                   2*(q.x*q.z + q.w*q.y),
                   q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z,
                   2*(q.y*q.z + q.w*q.x),
                  -2*(q.x*q.z - q.w*q.y),
                  res);
      break;

    case zxy:
      threeaxisrot( -2*(q.x*q.y - q.w*q.z),
                      q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z,
                      2*(q.y*q.z + q.w*q.x),
                     -2*(q.x*q.z - q.w*q.y),
                      q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z,
                      res);
      break;

    case zxz:
      twoaxisrot( 2*(q.x*q.z + q.w*q.y),
                  -2*(q.y*q.z - q.w*q.x),
                   q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z,
                   2*(q.x*q.z - q.w*q.y),
                   2*(q.y*q.z + q.w*q.x),
                   res);
      break;

    case yxz:
      threeaxisrot( 2*(q.x*q.z + q.w*q.y),
                     q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z,
                    -2*(q.y*q.z - q.w*q.x),
                     2*(q.x*q.y + q.w*q.z),
                     q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z,
                     res);
      break;

    case yxy:
      twoaxisrot( 2*(q.x*q.y - q.w*q.z),
                   2*(q.y*q.z + q.w*q.x),
                   q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z,
                   2*(q.x*q.y + q.w*q.z),
                  -2*(q.y*q.z - q.w*q.x),
                  res);
      break;

    case yzx:
      threeaxisrot( -2*(q.x*q.z - q.w*q.y),
                      q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z,
                      2*(q.x*q.y + q.w*q.z),
                     -2*(q.y*q.z - q.w*q.x),
                      q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z,
                      res);
      break;

    case yzy:
      twoaxisrot( 2*(q.y*q.z + q.w*q.x),
                  -2*(q.x*q.y - q.w*q.z),
                   q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z,
                   2*(q.y*q.z - q.w*q.x),
                   2*(q.x*q.y + q.w*q.z),
                   res);
      break;

    case xyz:
      threeaxisrot( -2*(q.y*q.z - q.w*q.x),
                    q.w*q.w - q.x*q.x - q.y*q.y + q.z*q.z,
                    2*(q.x*q.z + q.w*q.y),
                   -2*(q.x*q.y - q.w*q.z),
                    q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z,
                    res);
      break;

    case xyx:
      twoaxisrot( 2*(q.x*q.y + q.w*q.z),
                  -2*(q.x*q.z - q.w*q.y),
                   q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z,
                   2*(q.x*q.y - q.w*q.z),
                   2*(q.x*q.z + q.w*q.y),
                   res);
      break;

    case xzy:
      threeaxisrot( 2*(q.y*q.z + q.w*q.x),
                     q.w*q.w - q.x*q.x + q.y*q.y - q.z*q.z,
                    -2*(q.x*q.y - q.w*q.z),
                     2*(q.x*q.z + q.w*q.y),
                     q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z,
                     res);
      break;

    case xzx:
      twoaxisrot( 2*(q.x*q.z - q.w*q.y),
                   2*(q.x*q.y + q.w*q.z),
                   q.w*q.w + q.x*q.x - q.y*q.y - q.z*q.z,
                   2*(q.x*q.z + q.w*q.y),
                  -2*(q.x*q.y - q.w*q.z),
                  res);
      break;
    default:
      std::cout << "Unknown rotation sequence" << std::endl;
      break;
   }
}

掲載しています私の論文が"クォータニオンをオイラー角度の変換のための任意の回転配列を用い幾何学的方法"自分のウェブサイトnoelhughes.net.またアルゴリズムを変換するには、定のオイラー角は、クォータニオンとクォータニオンからの方向余弦マトリクスしたいと思います。これもマの腕のサイトが少しています。Googleマ名、ノエル-ヒューズ、,四元数とすべきものです。

私の解決このようになっております:

ステップ1:を確認する条約オイラー回転したい、と言う、 zyx.

ステップ2:計算、解析による回転行列の回転ができます。例えば、したい場合はR(zyx),

**R***zyx*=**R***x*( phi )***R***y*( theta )***R***z*( psi の要素となり

R11 =  cos(theta)*cos(psi)
R12 = -cos(theta)*sin(psi)
R13 =  sin(theta)
R21 =  sin(psi)*cos(phi) + sin(theta)*cos(psi)*sin(phi)
R22 =  cos(psi)*cos(phi) - sin(theta)*sin(psi)*sin(phi)
R23 = -cos(theta)*sin(phi)
R31 =  sin(psi)*sin(phi) - sin(theta)*cos(psi)*cos(phi)
R32 =  cos(psi)sin(phi) + sin(theta)*sin(psi)*cos(phi)
R33 =  cos(theta)*cos(phi) 

ステップ3:による検査ですsinタンの制度の要素です。この例では、

tan(phi) = -R23/R33

sin(theta) = -R13

tan(psi) = -R12/R11

ステップ4:計算の回転行列からクォータニオンを参照 wikipediaの要素が必要なものを計算するための角度として3)。

その他の規約を算出することが可能で、同じ手順です。

こちらは紙に書いた基に変換するクォータニオンをオイラー角度

リンク1

も置いて多数の文書がこの場所を議論の様々な側面,四元数、オイラー角度や回転行列(DCM).

リンク2

いつまずこのページをGoogling、最近は見つかり微これらの変換のために全12の固有Tait-Bryan(1-2-3,3-2-1等) 適切なオイラー(1-2-1,3-1-3等) 回転配列については、以下の参考文献:

感謝 frodo2975 のリンクです。

Wikipedia を示してどのように利用できます部品の非平衡ダイナミクスを計算するオイラー角度

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top