VATによる群衆表現③:頂点カラーによるキャラクターバリエーションの切り替え
Houdiniをゲームに使うとなる場合によくある用途の一つが群衆だと思う。 一通り流れを踏襲しておきたいので追ってみる。 また、VAT3.0になってからのVATを触ったことが無いのでこの機に触ってみる。

(修正:2025/04/04)CheapLerpについて、見つからないためLerpで代用したと書いていましたが、チュートリアル動画の8:30くらいで紹介してくれていたので使用している版に写真の修正など行いました。
環境
HoudiniIndie20.5.522
HoudiniEngine20.5.522
HoudiniLabs Plugin2.0
参考にするチュートリアル
そこそこ古い動画だがこちらのような表現をできるようにしたい 詳細な流れが紹介されているわけではなく、用例紹介のような動画なので完全に同じフローにはならないかと思う。
Vertex Animation Textures for Crowdsチュートリアル
https://www.youtube.com/watch?v=StGJ1l8noNs
本記事ではチュートリアルで行っている頂点カラーによるキャラクターバリエーションの切り替えを再現する
前回の記事
VATによる群衆表現①:ソフトボディVATでキャラクターを動かす
https://www.procedural.jp/articles/4pxh95hix
VATによる群衆表現②:LODを含むVATの作成
https://www.procedural.jp/articles/nfy3yj8h0
実行結果
以下のLODを持つVATモデルは単一のマテリアルインスタンス、単一のVATで構成されている。
パーツごとに別々の頂点カラーを設定し、同一VATモデルをカスタムパラメータで表示する部位を切り替えることができた。

UnrealEngine上での設定
この表現をするために必要なのは主にUEのマテリアル側の設定になる。
※動画上で詳細を説明していないためところどころチュートリアルのデータと異なると思います
ブレンドモードを設定
BlendModeをMaskedに変更

MFCeapLerp
チュートリアルではLerpの代わりにMFCheapLerpという関数を作成して利用している。
こちらの方が軽いらしい
(実際にプロジェクトで速度を求める場合は測定して使った方が良いと思います)

頂点カラーでOpacityを制御するためのマテリアルを作成
VertexColorを作成し、各チャンネルから
Multiply( *10)、Subtract(-10)、必要な数だけ複数のAdd(+10 ~)、saturate、CheapLerpを作成し、Saturateからの入力をLerpのAlPha、ScalarParamを利用したい切り替えの数だけ作成する。

画像だとR=1に該当するCheapLerpの入力とR=0.6未満に該当するLerpのALphaに定数の1、ないし定数の0が入っているがこれは必ず表示したいものと必ず表示したくないもに定数が入る形となる
(例えば素体に服を着せるような切り替えを用意する場合、素体は必ず表示したいとした場合素体の色はR=1で常に表示するように設定する等の使い方)
カスタムプリミティブデータを作成
ScalarParmに紐づく Primitive Data Indexを設定

ブループリントの作成
カスタムプリミティブパラメータを利用するためにアクターを作成する
コンテンツブラウザから右クリックで空のアクターを作成

ブループリントに対象となるメッシュを追加し、EventBeginPlayと追加したメッシュ、SetCustomPrimitiveDataFloatを接続するとアクターでカスタムパラメータが利用できるようになる

カスタムパラメータのセッティングがうまくできていればシーンに置かれたアクター内のメッシュごとにカスタムパラメータが利用できるようになっている

動作について
以上の設定でActorのカスタムパラメータから頂点カラーに応じたメッシュの表示切替ができるようになる。
動作をわかりやすくするためにテスト用のメッシュを作成した。

このメッシュに対してマテリアルを設定すると以下のように有効にしたVisFlagに紐づくRchが表示できる動作をしてくれる。

Gchからも同様の接続を行い、multipleでRchの出力と合わせると
(※チュートリアルではaddでブレンドされていましたがそれで動作する理由が動画内に見当たらなかったのでmultipleでブレンドしています)

(0.1, 0.0, 0.0) ~ (1.0, 0.0, 0.0) と (0.0, 0.1, 0.0) ~ (0.0, 1.0, 0.0)までの頂点カラーを独立した表示切替のグループとして利用することができる。

キャラクターをパーツごとに色調を設定し動作させる
キャラクターのVATでこの仕組みの表示切替を行うためにHoudini上で切り替えたいパーツごとに頂点カラーを設定する

VAT出力時に頂点カラーを持たせるためにLabsVertexAnimationTextureのExportStaticMeshVertexColorsを有効
またこの時頂点カラーとして認識するのはvertexアトリビュートのCd_vというアトリビュートなので頂点カラーこの名称のアトリビュートに変更して出力する

以上の設定で単一のマテリアルインスタンスで表示バリエーション切り替え可能なVATを作ることができる。
gif左側のモデルのように重ねて表示することも可能なのでチュートリアルではこれで重ね着したキャラクターバリエーションとして利用していた


機会があったら是非試したい機能だと感じます。

fish_ball
プロシージャル魚類