UE5 Geometry Script を利用した頂点単位リアルタイムアニメーション

Geometry Scriptの利用の一環で

  • 入力メッシュの頂点インデックスをUV1に埋め込み、外部テクスチャに頂点座標をベイク
  • 上記で生成したメッシュとテクスチャを利用してマテリアルで頂点単位バネアニメーション

というものを試してみました

サンプル

レベルに配置されている BP_ControllerInEditorTick を動かすとプルプルします.
Playを実行すると物理で動くモデルがプルプルします.
github.com

構成

  • BP_GenerateMeshForPerVertexAnim
    • 入力StaticMeshアセットから以下のようなアセットを生成する
      • UV1に頂点インデックスを埋め込んだStaticMesh
      • 頂点インデックスに対応したテクセルにローカル頂点座標をベイクしたテクスチャ
  • BP_PerVertexAnimationTest
    • 上記で生成したMeshとテクスチャを利用して頂点単位バネシミュレーションをマテリアル(GPU)で計算する
  • BP_ControllerInEditorTick
    • Editorモードのマニピュレータ操作でバネシミュをプレビューするためのコントローラ

導入

プロジェクトで Geometry Script プラグインを有効化

編集/プラグインエディタから Geometry Script のチェックボックスをONにする
必要ならEditorの再起動をする

PerVtxAnimWithGeometryScriptを取り込み

Windowエクスプローラ上などからプロジェクトのContentフォルダにサンプルの
PerVtxAnimWithGeometryScriptフォルダ
をコピー

生成用サンプルアクター をレベルに配置

BP_GenerateMeshForPerVertexAnim をレベルに配置

生成用サンプルアクターにアセットを設定

BP_GenerateMeshForPerVertexAnimアクターに変換元Mesh, 出力先Mesh & RenderTargetを設定
Sm Src Mesh に変換元のStaticMeshを設定, 図は同梱しているウシモデル(Spot)を設定している様子
Tex Bake Position Target にベイク情報を出力するRenderTargetを設定
Sm Bake Target に変換結果のMeshを出力するStaticMeshを設定

アセット生成

Geometry Scritpが駆動して Sm Bake Target と Tex Bake Position Target のアセットに生成物が保存される
Geometry Scritpはアクターのパラメータ変更等で駆動するため, 位置の変更や Enable Regenerate Mesh のONOFF等でトリガーされる

Sm Bake Target にはUV1に頂点インデックスを埋め込んだStaticMeshが出力される
Tex Bake Position Target には頂点インデックスに対応するテクセルに頂点座標がベイクされたテクスチャが出力される
これらのアセットを利用してリアルタイムに頂点単位アニメーションを実現する

ランタイムサンプルアクターをレベルに配置

BP_PerVertexAnimationTest は 上記アクターで生成されたメッシュとテクスチャを利用するサンプル

ランタイムサンプルアクターにアセットを設定

BP_PerVertexAnimationTest で生成されたメッシュとテクスチャをそれぞれ
Mesh Vtx Attr Baked と Tex Vtx Attr 0 に設定

概要

頂点単位のバネシミュレーションをGPUで実行するためにGeometry Scriptを利用している

Draw Material To RenderTarget で頂点単位計算をGPU実行する
そのためにメッシュのローカル頂点座標をテクスチャにベイク
(Geometry ScriptでのアクセスとCanvasDrawでのテクスチャ書き込み)
更にサーフェイスマテリアルで頂点毎の情報を上記テクスチャから取得するために
Geometry ScriptでUV1に頂点インデックスを埋め込んでいる


Draw Material To RenderTarget でローカル頂点座標テクスチャを利用してバネ計算した結果を変位テクスチャに出力

サーフェイスマテリアルでUV1から頂点インデックスをデコードし, そのインデックスからテクセル座標を計算,
テクセル座標で変位テクスチャから変位ベクトルを取得してWorldPositionOffsetで頂点を動かしている