座標変換ツール

モデルで姿勢を確認しながら変換行列, オイラー角, クォータニオンの値を印字します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

XFileConvert.exe の説明

  1. モデルで姿勢を確認しながら「変換行列, オイラー角, クォータニオン」の値を印字します。
    オイラー角は、XYZの回転順序によって姿勢が変わります。
    このプログラムでは DirectX に備わっている関数を使用しているので「ZXYの順」になります。
    オイラー角を使ってアニメーションする場合、ヘディングとバンクを ±180°に、ピッチを ±90°に制限します。
  2. Matrix.exe を起動するとティーポットのモデルが表示されます。
    スピンボタンをクリックして、モデルの姿勢を設定して下さい。
    姿勢が変わる度に「変換行列, オイラー角, クォータニオン」の表示が更新されます。
  3. 無理な値を設定すると正規化や補間のときに「モデルが変形したり表示面が反転」することがあります。
    Quaternion を操作したときは Normal ボタンをクリックして、Normalize した値を使うことをお勧めします。
  4. 印字ボタンをクリックすると、その時の姿勢データが Matrix.txt に書き出されます。
    Yaw, Pitch, Roll は heading, pitch, bank と呼ばれる場合もあり、厳密には違いもあるようですが同じ物と思って下さい。
  5. 以下の関数は DirectX の関数を使っています。
    1. ヨー・ピッチ・ロール⇒回転行列
      D3DXMATRIX *D3DXMatrixRotationYawPitchRoll
      (   D3DXMATRIX *pOut,
          FLOAT Yaw,
          FLOAT Pitch,
          FLOAT Roll
      );
      
    2. 回転行列⇒クォータニオン
      D3DXQUATERNION *D3DXQuaternionRotationMatrix
      (   D3DXQUATERNION *pOut,
          CONST D3DXMATRIX *pM
      );
      
    3. クオータニオン⇒回転行列
      D3DXMATRIX *D3DXMatrixRotationQuaternion
      (   D3DXMATRIX *pOut,
          CONST D3DXQUATERNION *pQ
      );
      

【X-FILEと回転アニメーション】

  1. X-FILE に関して幾つかの疑問点があります。
    問題点とその対策ですが、もしかしたら間違っているかも知れません。 (^_^;)
    間違いやもっと良い解決方法があればメールして下さい。
  2. DirectX は左手座標系ですが、Java は右手座標系です。
    DirectX と Java では変換行列の行と列が入れ替わっているようです。
    座標系が変わると行と列も変わるのでしょうか?
  3. X-FILE の回転アニメーションには Quaternion が良く使われます。
    アニメーションモデルの確認は DirectX に備わっていたビューア(mview.exe)を使っています。
    ところが Quaternion を設定した時点でモデルの上下が反転してしまいます。
    Quaternion.Identity(回転しないでそのまま描画)の値は「0.00, 0.00, 0.00, 1.00」です。
    この値をモデルに設定すると、Quaternion の設定前に比べて「Z軸を中心に180度回転」して描画されます。
  4. その対策ですがビューアで描画した時点で反転するので、X-FILE の回転行列を利用して元に戻す方法を考えました。
    X-FILE の SkinWeights には回転行列を設定する場所があります。
    既定値では単位行列(回転しない)になっています。
    1.000000, 0.0, 0.0, 0.0, 
    0.0, 1.000000, 0.0, 0.0, 
    0.0, 0.0, 1.000000, 0.0, 
    0.0, 0.0, 0.0, 1.000000;;
    
    これを「Z軸を中心に180度回転」に修正して下さい。
    -0.99995, 0.00999, 0.0, 0.0, 
    -0.00999, -0.99995, 0.0, 0.0, 
    0.0, 0.0, 1.000000, 0.0, 
    0.0, 0.0, 0.0, 1.000000;;
    
    これでビューアで180度回転せずにアニメーションされるようになりました。
  5. Quaternion の順序ですが、プログラムの仕様では次のようになっています。
    public Quaternion(float valueX, float valueY, float valueZ, float valueW);
    このツールで出力する順序もプログラム仕様に合わせて「X,Y,Z,W」の順に印字しています。
    Quaternion で「X回転,Y回転,Z回転」の単純なデータを作成してモデルに設定してみました。
    X回転ではZ方向に、Z回転ではX方向に回転するので確かめて下さい。
    X-FILE の Quaternion は「Z, Y, X, W」の順に設定するのでしょうか。
  6. X-FILE が「Z,Y,X,W」の順に格納されているものとして Quaternion で補間してみました。
    単純な回転はうまく動作したのですが、組み合わせるとビューアの動きと違います。
    DirectX の Viewer は Quaternion の補間を使っていないのでしょうか。

Down Load

Matrix.exe の Down Load

提供するするファイルは LHA で圧縮されています。
解凍して Matrix.exe を適当なフォルダーに格納して使用して下さい。