MID2Motion (1.2.1) | 2015-11-07 15:31 |
MMDIKSolver (1.2) | 2015-06-13 19:45 |
MMDMotion (1.5.1) | 2015-11-05 17:38 |
MMD の各種ファイルの仕様と Java オブジェクトでのその対応など説明します。
MMDの各種ファイルでは、だいたい番号のIDでオブジェクトを区別していますが、 モーションやポースは名前で区別しています。 名前長の限界がファイルによって違うので注意してください。 MMDMotion は VMD以外のモーションファイルにも対応する予定で、 PMXモデル対応のモーション操作をします。
obj 種別 | MMDMotion | VMD | PMD | PMX | CSV Motion |
モデル名 | Java String (可変長Unicode) | 20 byte 固定長SJIS | 20 byte 固定長SJIS | 可変長UTF-16LE,UTF-8 | 可変長SJIS |
ボーン名 | Java String (可変長Unicode) | 15 byte 固定長SJIS | 20 byte 固定長SJIS | 可変長UTF-16LE,UTF-8 | 可変長SJIS |
ボーンID | なし | なし | 16 bit (0-65535) | 32 bit unsigned (0-2G) | なし |
モーフ名 | Java String (可変長Unicode) | 15 byte 固定長SJIS | 20 byte 固定長SJIS | 可変長UTF-16LE,UTF-8 | 可変長SJIS |
モーフID | なし | なし | 16 bit (0-65535) | 32 bit unsigned (0-2G) | なし |
MMDの座標は基本的には左手座標系ですが、3直角インジゲーターはなぜか右手系になってます。 右の図の座標模型は左手座標系になってます。(赤:x, 緑:y, 青:z) MMDの普通の座標軸は右手系になってますが、 本当は左手系なのでだまされないようにしてください。MMD座標軸はグローバル座標と呼ばれます。 模型が指してるのはローカル座標と呼ばれます。グローバル座標系のy軸は重力上方向を指してます。 ローカル座標系は、グローバル座標をつかって下記のポーズデータ(と一部モデルデータ)によって決定されます。
ボーンのそのフレームでの位置は、下に書かれているポーズ座標値で決定されます。 これをそれぞれのボーンとフレームごとにリストしたものがモーションファイルです。 左の3つが並進x,y,zで、モデルのボーンの初期値からグローバル座標系でその値並進した位置に、今のボーンの点があるという意味です。 右の3つが回転x, y, z でグローバル座標系を、y軸にRy度,x軸にRx度,z軸にRz度回すと今のローカル座標系になるという意味です。 ボーンに関連する頂点(vertex)はローカル座標を基準に動きます。 しかし、実際は3つの角度ではなく4元数(クオータニオン)で管理されてます。VMDモーションファイルにはこの4元数が記録されてます。
MMDMotion では、座標の位置、並進には3次元ベクトル (Vector3D) を使いますが、回転の表現に4元数そのものではなく、3x3回転行列 Matrix をつくって記録し利用してます。こっちのほうが、回転などの計算精度が高くなる上に計算速度が速いからです。 4元数に書き戻すのも回転行列からならさほど難しくないです。
この回転行列は、回転行列をRとして、ローカル座標表記のベクトルをlとし、 グローバル座標系表記のベクトルをgとしたとすると、グローバル座標系の表記とローカル座標系の表記の変換が、
g = R l
とあらわすことができるという表記です。これはJava のコードでは
のようにすることができます。回転操作としては、グローバル座標の座標模型を回転させて、ローカル座標用の模型に合わせることができます。
この変換から予想できると思いますが、この行列は列ベクトルが前から順番に、グローバル表記からみた ローカル単位 x ベクトル,y ベクトル,z ベクトルになってます。Matrix を 9 つの数字を使ってコンストラクト (new Matrix(double r)) することもできますが、冗長すぎる上に計算を間違うと大変なので、通常は次のものを使ってコンストラクトしてください。
逆にこのような別の回転表記にもどすには次のメソッドが用意されてます。
MMDでは右の表のようなインターフェイスでモーションが管理されてます。横軸がフレーム番で, 縦軸がボーン名,ダイヤモンド型のアイコンがある場所がキーポーズで、 無い場所はフレーム番の前後のキーポーズの間を補間します。 補間は後ろ側のキーポーズに記録されている4点ベージェ曲線データを利用して補間がなされます。 キーポーズには、並進3次元ベクトルと回転の4元数が記録されています。 以上がボーンに関するポーズであって、他にモーフのポーズ、カメラのポーズ、照明のポーズ、影のポーズ、表示などのスイッチのポーズが存在します。
VMDモーションファイルは、これらのキーポーズのデータを、ポーズ種類順 / ボーン順 / フレーム番順にリストしただけのファイルです。
Java オブジェクトの Motion によって、 Poseをボーン名とフレーム番の両方から管理する形になってます。
ここからは、MMDMotion for Java が、他のモーションツールと大きく違うところですよ!MMDMotion では、モデルにモーションを適応して全てのボーンの位置とローカル座標系を決定することができます。
Java オブジェクトの Modelにします。Modelには標準コンストラクターはありません。必ずモデルファイルを読み込む必要があります。
モーションと違って、toXXX はありません。モデルからボーンとモーフの情報しか読み取らないので、不完全だからです。
モーションを適応します。ちゃんと予定どおりに動いてるか確認するには、
ポーズではなけど動かしてみる場合は、Boneを取得して、それに動かす命令を出します。
ボーンのグローバルでの現在位置を取得します。
[PageInfo]
LastUpdate: 2015-06-17 00:21:28, ModifiedBy: naz_o
[License]
Creative Commons 2.1 Attribution
[Permissions]
view:all, edit:login users, delete/config:members