HOME

キャプチャモーションのリターゲットパイプラインを構築する

キャプチャしたモーションをいつでもリターゲットできるようにしておく

リターゲットについて

体型や骨構造の異なるキャラクターに同じモーションデータを適用しようとすると関節が伸びたりなどの破綻が発生する。

mixamo間は骨が同名なので体形の異なるモデルにモーションを流せるものの、破綻してしまう

これを解決するために体形に合わせてモーションを変換する作業がリターゲットであり、
フーディニではリターゲットを行う仕組みが用意されている。
今回はそれが記載されている公式ドキュメントを追って、モーションキャプチャデータをリターゲットするための構成を構築していく。

アニメーションの転送
https://www.sidefx.com/ja/docs/houdini/character/kinefx/retargeting.html

リターゲットの仕上げとクリーンアップ
https://www.sidefx.com/ja/docs/houdini/character/kinefx/retargetcleanup.html

今回記事で追った内容が公式ドキュメントの内容すべてではないので、
より調整やブラッシュアップが行いたい場合は上述の公式ドキュメント2リンクを参照すればいろいろできることを増やせると思う。

環境

Houdini Indie 20.5.445

リソースは転送用のキャラクターとしてmixamoとキャプチャしたモーションはバンダイナムコ研究所が公開してくれているモーションキャプチャのデータを利用させてもらう。
(おまけで完全に体形の異なる猫もfabの年末セールで購入したのでそちらでもテストしている)

mixamo
https://www.mixamo.com/

Bandai-Namco-Research-Motiondataset
https://github.com/BandaiNamcoResearchInc/Bandai-Namco-Research-Motiondataset

Cats Pack | Fab
https://www.fab.com/ja/listings/43c831f0-fc9f-499d-8d53-9596047dbb5e

※リンク先のBandai-Namco-Research-Motiondatasetのモーションデータは CC BY-NC 4.0 で提供されているので営利目的では使えません。

補足:ノードキャッシュについて

おそらくHoudiniでモーションを扱う工程全体に言えることなのかと思うが、RigPoseなどでノード内部にキャッシュが残ってしまいノードの状態が更新されない場合が多々ある。
そういった場合は 上部メニュー/ windows/ Cache Managerからキャッシュのクリアを行う、シーンを開きなおすなどでキャッシュをクリアすればノードの状態が更新される場合がある。

ノードのキャッシュを削除するウィンドウ

リターゲットを行うためのノードグラフ

リターゲット用のノードグラフ全体

houdiniのドキュメントに記載されているモーションキャプチャの構成をベースに作成していく
実行すると以下のような精度でリターゲットできる。

リターゲットの結果

以下、各ノードの動作の説明。

rig stash pose

デフォルトのポーズを rest transform アトリビュートとして保管するためのノード。 第1入力にはリターゲット元のモーションを入力する。ExtractLocomotionはwalkなどの移動値を別に保管して中央に固定するためのノード。

第2入力にTポーズ、Aポーズなどのデフォルトポーズを入力する。Bandai-Namco-Research-Motiondataset にはデフォルトポーズが見当たらなかったので比較的Aポーズに近かったdataset-1_guide_normal_001.bvhをtimeshiftノードでの1フレーム目に固定して入力している。

RigStashPoseでデフォルトポーズを取得(白い方のスケルトンが第2入力のデフォルトポーズ)

rig pose

スケルトンの状態をアトリビュートとして保存するノード。
ここではmixamoのデフォルトポーズがTポーズなのでモーションキャプチャデータのデフォルトポーズ(として仮定した)Aポーズに近いポーズに変更している。

rigposeでmixamoのポーズをキャプチャモーションのデフォルトポーズに寄せる

余談だがこの「モーションキャプチャ側にStashポーズで持たせたポーズに合わせる工程」を怠ると以下のようなポーズの差分だけずれたリターゲット結果になってしまう

余談:ポーズを寄せなかった場合のリターゲット結果

map points

転送元と転送先でジョイント同士でFootとFoot、HandとHand…みたいな組み合わせを設定するためのノード。
ノードを選択している状態でシーンビュー上でEnterを押すとジョイントの組み合わせをシーンビューで設定できるような状態になる。
今回は16ジョイントで組み合わせを設定している。

MapPointsでジョイントの組み合わせを作成

Full Body IK Configure Targets

full body ikを動作させるための設定を追加できるノード。
接地の高さ補完の機能が使えるのでそれを利用している。
(滑りを軽減する方法もどこかで見た気がするが今回ちょっと見つけられませんでした。機能が判り、有効そうであればいずれ追記します。)

FBIK Configureで接地補正するジョイントを指定
かかとで設定した場合の接地補正有無による違い 高さが一致する

実行結果と所感

Bandai-Namco-Research-Motiondatasetのリターゲット結果

今回、設定をあんまり厳密に作っていないため補完系の機能を強めすぎると重心がずれたりというような症状も見受けられたが、他にもリターゲットに利用できそうな精度向上のための補完機能もあるのでそのうち有用かどうか試してみたい。

おまけ

4足に2足を適用できるかテストするためにFabの年末セールで買った猫もリターゲットしてみた。
元のモデルが2足にすると破綻してしまうものだったので、まぁ。
これだけだと実用かどうかの判断は難しいが…適当な調整でまぁまぁ動いたので設定を試行錯誤すればもっと無茶なモーションの汎用化もできるかも

Bandai-Namco-Research-Motiondatasetを4足歩行の猫にむりやり適用
※元モデル

fish_ball

プロシージャル魚類