モーションキャプチャデータの使い方(計画編)

前回予定していました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こわい。。。)