mikoto形式下調べ

プログラムを書く前に情報収集。

mikoto形式によるモーションは、ある規則に従ったmqoと
それに対するモーション(1フレームだとポーズ?)を記述するmkmファイルの2つから構成されるらしい。

mqoには通常のモデルに加えてボーン形状と、
ボーンの影響範囲を表すアンカーという形状を追加する。
mkmには、ボーンの動き(回転->クォータニオンで記述されていた)をキーフレーム毎に記録すると。

ボーン(スケルトン)オブジェクト

bone:
と名付けてmqoに作る。
でボーンに階層構造を作っていくことになるのだが、
オブジェクトの名前は一個しかつけられないので個々のボーンの名前は
マテリアルの名前を代用するというルールになっている。
三角形の作り方の詳細はまぁいいや。

ボーンとモデルの関連付け

bdef:
bdef:が頭についたオブジェクトは一番近いボーンの影響を受ける

sdef:
sdef:が頭についたオブジェクトはanchorによりボーンの影響を受ける

anchor名前|対象の名前
対象のボーンにつけたマテリアルと同じマテリアルを適用することで対象ボーンを指定する。
sdef:と名付けた対象の名前を|の後に指定することで形状を指定する。
さらに実際に形状で囲んでsdef:オブジェクトの一部にボーンの影響を限定する。
囲む形状は凸形状でなければならないということだが、これはアンカーを構成する全三角形の法線の反対側にある点を中にあると判定することで再現できそうだ。

mkm

多分そうだろうというメモ。

 Mikoto Motion Ver 2
 Motion {
 	name = "walk" # モーションの名前
 	endframe = 39 # 最後のフレーム
 	loop = 1 # モーションをループする
 	Vector { # ルートボーンの位置
 		name = "j_chest" # 対応ボーン名
 		class = "Locate" # 位置
 		member = "pos" # 位置
 		curve = "spline" # スプライン補完
 		0 (0.254500 106.130096 0.058000)  # frame 0 の位置
 		10 (0.254500 101.630096 0.058000) # frame 10 の位置
 		20 (0.254500 106.130096 0.058000) # frame 20 の位置
 		30 (0.254500 101.630096 0.058000) # frame 30 の位置
 	}
 	Quaternion {
 		name = "hip" # 対応ボーン名
 		class = "Bone" # ボーンが
 		member = "rot" # 回転する
 		curve = "spline" # スプライン補完
 		0 (0.745218 -0.015511 -0.000034 0.666640) # frame 0での回転
 		10 (0.745218 -0.015511 -0.000034 0.666640) # frame 10での回転
 		20 (0.745218 -0.015511 -0.000034 0.666640) # frame 20での回転
 		30 (0.745218 -0.015511 -0.000034 0.666640) # frame 30での回転
 	}

 ・・・中略・・・
 }

思ったよりフォーマットはシンプルだったので安堵した。
mqoを無視した独自形式ならもっとわかりやすくもできるであろうが、
mqoの中に押し込めるにはこうするしかないという感じだ。


というわけで次から実際のモーションの実装に入る予定。
mkmの読み込みはできそうだが時間がかかりそうだ。
まずは箱人間みたいなのをmkmで動かすものを作って、
うまくできたら箱人間をmqoのモデルに置き換える段取りにするかな。
ぼちぼち進めていくしかないなぁ。