BACK TO TOPPAGE




出力ファイルフォーマットについて

  1. スキンメッシュファイル

  2. パラメータファイル(*.prm)
    このソフトウェアで使うパラメータです。
    左からボーンのインデックス、対称となるボーン、スキニング用のパラメータH,Rの順に格納されています。
    Parametersダイアログの内容が保存されているわけです。

  3. アニメーションファイル(*.anm)
    一行目"NumBones: "の隣にボーンの数があり、二行目以降はキーフレームのデータです。
    キーフレームデータ最初の行は"Time: "の隣に現在の時刻、次の行の"Quaternions: "の次の行から
    キーフレームにおけるボーンの姿勢を表すクォータニオンが、ボーンの数だけ並んでいます。
    並び順はこのソフトのBoneダイアログと同じ順番に、上から並んでいます。
    クォータニオンをw + x * i + y * j + z * k と表す時、左からx,y,z,wの順で並んでます。
    但し、w,x,y,zは実数であり、

    i * i = j * j = k*k = -1
    i * j = - j * i = k
    j * k = - k * j = i
    k * i = - i * k = j

    となります。(クォータニオンの詳しい解説については他のサイトや書籍等を参考にして下さい)
    なお、このファイルにおけるクォータニオンは、モデルのデフォルトの静止状態からの、親ボーンに
    対する変換を表しているので、デフォルト状態の回転の中心と親子関係さえわかれば、
    このクォータニオンで表される姿勢を計算する事ができます。
    実はこれらの情報を出力しているのが、次に説明するボーン情報ファイル(*.bnf)なのです。

  4. ボーン情報ファイル(*.bnf)
    一行目の数字がボーンの数、次の行からは(ボーンのインデックス)(親ボーンのインデックス)
    (ボーン回転中心の座標x,y,z)の順番に並んでいます。
    ただし回転中心は、親ボーンのローカル座標ではなく、モデルのローカル座標で表されております。
    即ちこれらを順にID,ParentID,Rx,Ry,Rzとおくと、ボーンインデックスIDのボーンが、クォータニオンq[ID]を
    与えられた場合の変換行列は以下のようになります:

    (注:一般的な線形代数の教科書が変換を行う順に次々と左から掛けているのに対して、
    DirectXでは行列の掛け算の順番がそれとは逆になっているようです。これは行列Mに対して
    ベクトルvを変換する場合の表現が、DirectXではv*Mとなっているからです。一般的な線形代数の
    本では、ほとんどがM*vの表記になっていると思います)



    ここで、T( x , y , z)は( x , y , z )だけ平行移動させる変換行列、QuaternionToMatrix(q)はクォータニオン(q)
    を対応する行列に変換したものです。式の中身については、やはり他のサイトや書籍に譲ることにします。
    ただ、DirectXにはD3DXQuaternionRotationMatrixという関数が用意されていて、これを用いれば
    クォータニオンを行列に変換することができます。
    ちなみに、アニメーションを再生させる場合であれば、キーフレームごとのクォータニオンの親子関係を
    あらかじめ全て計算しておいてもいいでしょう。この場合、変換行列は次のようになります:


    但し、

    q’[0] = q[0]
    q’[ID] = q[ID] * q’[ParentID] (ID > 0)

    であり、Rx’,Ry’,Rz’は、

    クォータニオンp( w , x , y , z ) = ( 0 , Rx , Ry , Rz )、
    クォータニオンp’( w , x , y , z ) = ( 0 , Rx’, Ry’, Rz’)

    とおいたときに、

    p’ = q’[ParentID] * p * q’-1[ParentID]

    となります。
    なお、常にParentID < IDとなっているので、IDを0から順に(ボーンの数−1)までforループを用いて
    1ずつ増加させながら計算すれば、全てのq’[ID]を取得することができます。
    (近日中にこの部分のプログラムソースコードをアップロードする予定です)