2022年の4月も終わるころ、GitHubにバンダイナムコ研究所よりモーションキャプチャのデータが公開されたようです。※ニュースリリース
そのキャプチャデータのファイル形式が今では珍しい(?)BVH形式を採用していました。
10年くらい昔、Perfumeのダンスモーションが配布された頃には色んなツールへのインポートスクリプトの記事が見られましたが、今回はどうでしょうかね、BVHは古い規格なのでそんなに需要もなさそうですし、当時のものを使う感じになるんでしょうか。
ということで、BVHファイルをインポートする MELスクリプトを作成してみました。
tryBvhImporter.mel
※2022/05/12最終更新
当時、いろんなBVHインポータの記事を読んでいても、BVHの仕様に合わせて作成しているというより、配布されたBVHに合わせて読み込み処理を作成していたものが大半だと感じました。
なので今回作成したスクリプトではBVHの仕様にあわせつつ少々融通を利かせた処理を行っています。
ここで簡単にBVHの書式について
BVHは大きく分けて「HIERARCHY」と「MOTION」の2つの部分で構成されます。
まず、HIERARCHYにはスケルトンの構造に関する情報が記述されています。階層構造は「{」で始まり、「End Site」で階層が終了。
「}」の数だけ階層が戻り、「JOINT」を見つけたら再度階層が始まります。
「JOINT」のキーワードに続いてジョイント名。
「{」に続いて親ジョイントとのオフセット値と、アニメーションさせるアトリビュートの数とアトリビュート名が続きます。
ここで、positionと rotationのXYZの並びに違いがある事に気づくかと思いますが、この rotationのZ-X-Yの配置でジョイントの「回転順序」が表現されています。Mayaの回転順序は、xyz,xzy,yxz,yzx,zxy,zyxの6種類あるので、rotationの並びから判別する必要があります。
全ジョイントで同じ回転順序が指定されているはずですが、そのチェックはエクスポータの仕事なので、インポータではエラーチェックなどはせず全てそのまま受け入れます。
「CHANNELS」は、本来のBVHの仕様では最上位のジョイント(Hips)だけ 6chで、それ以外は回転のみの 3chで大丈夫なはずですが、出力された階層構造を見てみると、Hipsの親に原点用のジョイントが有るため、全てのジョイントで translateのアトリビュートにキーを付けているのだと思われます。ゲーム用のデータっぽい仕様ですね。
Joint Orientについても元々BVHでは非対応なはずですが、アニメーションを適用する前のデフォルトポーズが特殊な配置になっていて、軸を持っているように振る舞っています。
本来のBVHのポーズでは、下図のようなデフォルトポーズを想定していて、回転軸もワールド軸と同一のジョイントでの構造になっています。
次に MOTIONでは、キーフレーム数や FPS、アニメーションのためのポーズが記述されています。
「Frames:」がキーフレームの数で「Frame Time:」にはキーフレームの間隔が秒数で記されています。
このファイルには 0.0333333(1/30)なので30fpsで出力されている事が分かります。ここはインポート先の mayaのフレームレートを調べて補正しないといけない部分です。
「Frame Time:」の次の行から始まる数値の羅列がアニメーションの情報です。1行に全身1フレームぶんのポーズの移動回転値が記述されています。ただ、各ジョイントのCHANNELSで示されていたアトリビュートの順で値が連続で並んでいます。
HIERARCHYの解析と同時に、ジョイント名、CHANNELS、回転順序などを格納しておく必要があります。
今回公開されたBVHファイルは、全ジョイントの Translateアトリビュートにキーが打たれていたり、ROOTのジョイントが 0,0,0,0,0,0の無駄な値が使用されていたりしますが、変な拡張はされていなくて比較的楽にインポータを作成できました。
最後に、tryBvhImporter.melの使い方
- tryBvhImporter.melを MAYA_SCRIPT_PATHへ配置し Mayaを起動します。
- コマンドラインなどで tryBvhImporterを実行するとインポートするBVHファイルを指定するダイアログが開くのでファイルを指定するとインポートが始まります。
0 件のコメント:
コメントを投稿