HOME

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モデルをカスタムパラメータで表示する部位を切り替えることができた。

パーツごとに設定した頂点カラーで表示を切り替えた同一VATモデル

UnrealEngine上での設定

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

ブレンドモードを設定
BlendModeをMaskedに変更

BlenModeをMaskedに変更

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

チュートリアルで利用されている代替Lerp関数

頂点カラーで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を設定

カスタムパラメータを利用するためにindexを設定

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

空のアクタを作成

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

カスタムパラメータを利用できるようにBPを接続

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

シーン内のアクターごとにカスタムパラメータが利用できる

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

動作確認用に作成した10段階にR,Gそれぞれの色調が分割されているメッシュ

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

頂点カラーのRchが指定の値であるメッシュを表示切替できるようになる

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

Gchからのノード構成もRch同様に作成する

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

R、Gそれぞれの単一色のメッシュで表示の切り替えが可能になる

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

頭、体、腕、腰、足で別々の頂点カラーを設定

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

頂点カラー出力のための設定

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

パーツごとに頂点カラーを設定し、切り替えて表示させることで複数のバリエーションを実現できる
シェーダー複雑度

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

fish_ball

プロシージャル魚類