🧍‍♀️

Houdiniでキャラクター全体のリダクションを検討する

2024/10/17に公開

キャラクター全体のリダクションがしたい。
(スキンメッシュ、モーション、スケルトンのリダクション)

環境

Houdini Indie 20.5.332
Unreal Engine 5.3.2
検証モデル:mixamo
https://www.mixamo.com/

概要

既存リソースの遠景用やNPCなどへの流用目的の軽量版スキンメッシュ、LODなどに利用できるかもしれないジョイントのリダクションを比較し、実用に足るかの検証。
Houdiniならポリゴンのリダクションは簡単にできるのでそちらも折角なので合わせて比較する。
行ってみた結論から言うとかなり可能性がありそうな結果。
sample001

スキンキャラクターのリダクションについて

スキンキャラクターを構成する要素は基本的に3つ。

  • スキンメッシュ
  • スケルトン
  • モーションデータ

キャラクター全体のリソースのリダクションをゴールとして、今回ポリゴン、スケルトン、モーションの持つジョイントのリダクションを考える。
(マテリアルやテクスチャなどもあるかと思うが「特定のキャラクターだけ重くなる」というより「仕様により全体の負荷が変動する」ようなものだと思うので今回は触れていない)

ポリゴンとジョイントのリダクションの結果

実際にリダクションしてみた結果。かなり可能性を感じるものにできたと思う。
reduction_result_00
reduction_result_01
角や前掛けなどのジョイントを削除するとさすがに周辺のジョイントに張り付いてしまった
reduction_result_02
reduction_result_03

とはいえ十分見た目の品質を維持したままかなりジョイントを削減できたと感じる。

こちらはUE上でのプレビュー。Fingerなどのジョイントを削除できているのがわかる。
UEでのプレビュー

ノード構成

今回メッシュリダクション、ジョイントリダクションのノード構成はかなりシンプルにできている。
ノード構成

ノード構成がシンプル・・・というか、ネタバラシになるが今回何か工夫してアトリビュートを転送しているようなことをしているわけではなく、KineFXのJoint Capture Biharmonicノードがただただ高品質な自動スキニングであり、それを使ってジョイントを削除した後のメッシュを自動で再度スキニングしてモーションでも同じジョイントを削除しているだけである。
https://qiita.com/jyouryuusui/items/1022cae78638ab9b27c6
メッシュについてもpolyreduceノードがスキンウェイトを高精度に残したままポリゴンのリダクションをしてくれる。

実用的なパイプラインを組む場合は、これに元データが破綻しないようなデータ転送を含んだり、かたいメッシュや変わった骨構造をもつ場合、それらを個別でバインドしてウェイトが散らないようにするなどの対応が出てくると思うが、少なくともこれだけの構造でそれっぽく動くメッシュの削減、ジョイントの削減を行ったキャラクターをすぐに作ることができる。

用途について

スケルトン、モーションのジョイントを削除してリダクションしたものを作成した場合、どういった用途に使うことが可能か。

段階的にリダクションをして負荷の当たり所を知る
処理負荷などの検証段階ではそれっぽいキャラクターを好きな段階でリダクションしたデータを用意できるので使い道があると思う。

スケルトンとモーションのLOD
LOD用途はどうか。メッシュのリダクションはLOD用途では便利だと思う。
モーションとスケルトンのLODはどうか。スケルトンが少ないLODが用意できるなら大量表示をしたい場合などで処理負荷を減らすことができるのでありだと思うが、それを動かすためのLODモーションデータという用途を考えた場合、キャラクターのリソースの中でも数が多く、容量も大きいモーションデータが「モーション数xLOD数」で数が増えるというのはあまり現実的ではなさそうに感じる。

UEで軽量スケルトン化したキャラクターを使う
モーションLODはリソース量が爆増してやばそうとは思うが、一方でUE5には「Compatible Skeleton」というジョイントの異なるスケルトンでも一致する部分でジョイントを動かしてくれる仕組みがある。
https://qiita.com/EGJ-Kaz_Okada/items/387b73923089c4622352
これを利用する前提ならば共通のモーションデータを軽量版スケルトンキャラクターで利用できるのLODとして利用できるかはシステムに依存するのでともかく、限定したシステム上で動作させるような、たくさん出す用のキャラクターみたいなものを最低限の工数で作成できるようになりそうな気がする。

キャラクターリソース資産がある組織で別用途向けに加工
個人的にこの用途が一番有用と思っているのだが、IPなどのキャラクター資産が豊富な組織で高品質なリソースが存在しているなら別プロジェクトで利用したいようなケースで柔軟にリダクションができる。
IPが強い組織ではユーザーが過去に出たキャラクターをたくさん登場させてほしいと考える機会は案外多いと思う。だがリソースをそのまま利用するということはほぼできないし、作り直しをしようとすれば工数の現実と向き合うことになる。
そういった場合に一部のキャラクターはちょっと破綻してしまうが、例えば7割くらいのキャラクターが許容範囲で動かせるとなればプロジェクトのできることは大幅に広がるし、今まで当然だと考えられていたコストも一気に削減ができるかもしれないと思う。

列挙すると

  • キャラクター全体のリソースを削減できることを利用した処理負荷の検証
  • モーションが独立している遠景専用のキャラクターを作成する用途
  • モーションデータの数が少ないNPCなどにコンバートする用途
  • UEのCompatible Skeletonで動かす目的のジョイント削減版スケルトンの作成
  • IPが確立しているコンテンツなどで多用途に使い回すための用途

なんにせよ、キャラクターが多いコンテンツほど何かしら効果的な仕組みを作ることはできそうである

Discussion