モーションキャプチャデータの使い方(計画編)
前回予定していましたFBX形式からメッシュやマテリアル情報を抜き出す方法ですが、FBXSDKのドキュメントがあまりにも、以下略であるため、断念しました。
簡単に理由をあげますと、クラスの説明がたったの英語5単語であったり、関数名がGetなのに説明がSetだったりとすさまじいものがあります。
ですので今回はFBXはおいておき、モーションキャプチャデータであるBVHファイルの利用方法を考えてみたいと思います。
これに対応できるMax,Mayaプラグインを近日に書きたいと思っています。
既に合成を終えたわけではありませんので、間違っている部分があるかもしれません。
その部分は合成が終了しだいプラグインのソースコードと一緒に公開したいと思います。
まずはモーションキャプチャデータの入手を行います。
幸いmocapdata.comさんでフリーのデータが配られていますのでこちらのDrinkモーションを使用しました。
データ形式はモーションビルダーから出力される形式であるBVH形式を利用します。
なぜならテキスト形式で最も構造が理解しやすいためです。
それでは早速drink.bvhをエディタなどで開いてみます。
階層構造の理解
HIERARCHY ROOT Hips { OFFSET -20.7799 39.8705 -6.41841 CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation JOINT LeftHip { OFFSET 3.43 -2.81208e-014 -2.13163e-014 CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation JOINT LeftKnee { OFFSET 0 -18.47 2.13163e-014 CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation JOINT LeftAnkle { OFFSET -1.06581e-014 -17.95 1.33227e-015 CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation End Site { OFFSET 0 -3.12 0 } } } } ...(略) |
上から順に見ていきます。
- HIERARCHY
スケルトンの階層構造定義の開始。 - ROOT
基点となる特殊なノード。 - OFFSET
ノードのオフセット成分。
ルートノードの場合はワールド座標から、それ以外の場合は親ノードから間接ノードへのオフセット成分。
モデリングソフトから抽出した基点位置を合わせるために使用。 - CHANNELS
間接自由度。
X, Y, Zの位置座標、Z, X, Yの回転自由度の順に定義されています。 (今回は)
もちろん、どれか1つだけの場合もあります。
この指定によりトランスフォーム行列を計算することができます。
- End
階層構造末端ノード。
OFFSETのみ要素を持つのですが、何に利用するのか調査中です。
(Siteというノード名で普通のノードであるのか、それとも別用途であるのか)
上記を繰り返すことによって
階層構造が定義されています。
全ての定義が終了すると、次に座標を記録した部分があらわれます。
モーション記録情報の理解
それでは、モーション記録部を見てみましょう。
MOTION Frames: 751 Frame Time: 0.0333333 17.8378 39.6935 -4.63393 0.802098 0.0108709 -0.297077 3.43 ...(略) |
- MOTION
モーション情報の記録開始部分です。 - Frames
記録されたフレーム数です
今回の場合は751フレームあるようです。 - Frame Time
1フレーム更新するための時間。
今回ですと0.03ですので33fpsになります。
ゲーム製作の視点からですと60fpsが主流ですので、こちらはカクカクするのではないか、と思われるかもしれませんが、3Dの専門の方に聞いたところ30fpsが標準だそうですので特にモーションの隙間を補間したりする必要はなさそうです。
ちなみに他のデータもダウンロードしてみましたが、ほぼ30fpsでしたので、この部分はそのまま使用することにしました。 - タグは無し
次に大量の座標、回転角が記されています。
こちらは先ほどCHANNELで定義されていた順序どおりに座標、角度が記されています。
ですので今回は、X, Y, Z座標、続いてZ, X, Yの回転角の順に記録されています。
1行に記録されている情報は1フレームの動作に対応しています。
ですので、必要なフレームからのみ抜き出す(最初のT字ポーズをはずす)といったことも可能です。
本来ですと、ここでFBXから抜き出したデータを利用して合成まで実証しようと用意していたのですが、FBXSDKから出てくる致命的エラーの前に断念してしまいました。(申し訳ありません)
ですので、明日から早速Max、Mayaプラグインを開発し、合成方法を公開したいと思います。
担当:松浦(FBXこわい。。。)