Geometry Scriptの利用の一環で
- 入力メッシュの頂点インデックスをUV1に埋め込み、外部テクスチャに頂点座標をベイク
- 上記で生成したメッシュとテクスチャを利用してマテリアルで頂点単位バネアニメーション
というものを試してみました
realtime fake secondary motion (WIP.
— なが (@nagakagachi) 2022年8月21日
position, rotation, and scale operations in editor mode.
Editorモードでの位置とスケールの操作プレビュー対応まで.
あとプルプルしすぎていたので更に調整.#UE5 pic.twitter.com/xgzYPtIGpw
サンプル
レベルに配置されている BP_ControllerInEditorTick を動かすとプルプルします.
Playを実行すると物理で動くモデルがプルプルします.
github.com
構成
- BP_GenerateMeshForPerVertexAnim
- 入力StaticMeshアセットから以下のようなアセットを生成する
- UV1に頂点インデックスを埋め込んだStaticMesh
- 頂点インデックスに対応したテクセルにローカル頂点座標をベイクしたテクスチャ
- 入力StaticMeshアセットから以下のようなアセットを生成する
- BP_PerVertexAnimationTest
- 上記で生成したMeshとテクスチャを利用して頂点単位バネシミュレーションをマテリアル(GPU)で計算する
- BP_ControllerInEditorTick
- 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で頂点を動かしている