locked
視線行列 RRS feed

  • 質問

  • 初めまして。

    LookAtLH() を用いて算出した視線行列からオイラー角を算出したいのですが、どういう順序で掛け合わされているのかがわかりません

    ご存知の方ご教授いただければ幸いです。

    よろしくお願い致します。



    Vec3<T> zaxis = Normalize(at - eye
    Vec3<T> xaxis = Normalize(Cross(up, zaxis));
    Vec3<T> yaxis = Cross(zaxis, xaxis);
    Vec3<T> zaxis = Normalize(at - eye);
    Vec3<T> xaxis = Normalize(Cross(up, zaxis));
    Vec3<T> yaxis = Cross(zaxis, xaxis);
    return Matrix<T>(
    xaxis.x(), yaxis.x(), zaxis.x(), 0,
    xaxis.y(), yaxis.y(), zaxis.y(), 0,
    xaxis.z(), yaxis.z(), zaxis.z(),
    2016年11月29日 18:42

すべての返信

  • 質問をするときは最低限のマナーとして、開発環境(たとえばコンパイラのバージョンやライブラリなど)や実行環境に関して詳しく書いてください。

    技術系メーリングリストで質問するときのパターン・ランゲージ

    説明が要領を得ておらず、提示されたコードも中途半端で何がしたいのかいまいち分かりませんが、(何らかの制約条件を付けない限り)行列からオイラー角を一意に求めるのは不可能です。

    回転角および回転の順序(たとえばY, X, Z軸まわりにYaw, Pitch, Rollの順で回転)が決まれば当然回転行列は一意に定まりますが、たとえば簡単な例で言うと左手系で「Z+45度→Y+90度」と「Y+90度→X+45度」が同じ姿勢を表すことからも分かるように、逆は一意には定まりません。ビュー行列はカメラの姿勢行列に相当しますが、ビュー行列はあくまで最終的な姿勢(軸ベクトル)を規定するものであり、回転の順序は規定されません。回転順序のセットを1つ選んで定めてやれば、三角関数を用いてオイラー角を逆算することは可能ですが、特異点の境界条件には注意する必要があります。

    c++ - Direct3D - How do I calculate Roll from View Matrix? - Stack Overflow

    オイラー角と回転行列の相互変換における問題に関してはWebで検索すればいくらでも情報が手に入るし、線形代数のテキストやグラフィックスプログラミングの関連書籍には同次変換行列に関する説明が豊富に記載されています。

    O'Reilly Japan - 実例で学ぶゲーム3D数学

    3Dm_0000.indd - g3d_sample03.pdf



    • 編集済み sygh 2016年11月30日 14:20
    • 編集済み 星 睦美 2016年12月1日 0:26 回答以外の内容を一部削除しました。
    2016年11月30日 12:53
  • フォーラム オペレーターの星 睦美です。

    MSDN フォーラムへの投稿ありがとうございます。
    フォーラムの円滑なコミュニケーションのため、スレッドの返信から一部を削除いたしました。
    今後ともフォーラムをユーザー同士の技術的な情報交換の場として、お役立ていただけますようお願いいたします。

    フォーラムのご利用方法(質問の投稿)について

    フォーラムのご利用方法、ヘルプ、回答のガイドラインに関するお知らせ


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2016年12月1日 0:39