はじめに
今回は、以下のようなNiagaraで簡単にできる疑似Soft Body Simulationの解説をしていきます。
「疑似」と付いているのは、一応PBD(Position Based Dynamics)によるSoft Body Simulationではあるものの、制約条件が極めて単純で、ボリューム保存の制約条件もないので、ちゃんとしたSoft Body Simulationではないためです。
ですが、それでも見た目的にいい感じなのと、何よりとても簡単に実現できるという点で凄い良いなと思っています。さすがNiagara!
さっそく実装方法を見ていきましょう!
また、ここで説明する内容を実装したサンプルデータを以下で提供しているので、実際に動くデータがすぐに欲しい方は、確認してみてください。
https://heyyohanashima.gumroad.com/l/rbtwx
環境
Unreal Engine 5.2.0
概要
作り方を簡単に説明すると、Niagaraで対象Meshの各頂点に配置したParticleを、Pendulumモジュールを使って疑似Soft Body Simulationさせて動かし、その移動差分をRender Targetに書き込んで、対象MeshのWorldPositionOffsetで実際に頂点を動かします。
Niagaraの全体像は以下の画像のようになっていて、色分けした数字は、下記の手順の番号に対応しています。
また、Render Targetへの書き込みをするため、GPU Simである必要があります。
さっそく、実装手順を見ていきましょう。
手順
- Meshの各頂点にParticleを配置する
- Pendulamのセットアップをする
- Particleの移動差分をRender Targetに書き込む
- MeshのマテリアルでWorld Position Offsetを使い変形させる
1. Meshの各頂点にParticleを配置する
まずは、対象Meshの頂点数を確認し、同じ数分のParticleをSpawn Burst Instantaneousで発生させます。
次に、Static Mesh Locationを使い、StaticMeshの所に、対象のStatic Meshをアサインします。
Meshの各頂点に一つずつParticleを発生させるには、Mesh Sampling TypeをVerticesにし、Vertex Sampling ModeをDirect Vertexにして、Vertex IDにExecution Indexを入れることで、実現できます。
Execution Indexは、Spawn Burst InstantaneousでParticleを1発で発生させた場合、Paritcleの通し番号になっているので、頂点数と同じ数を発生させれば、ちょうどMesh頂点のIDとParticleのExecution Indexが1対1で対応します。
これで、Meshの各頂点にParticleを一つずつ配置することができました。
2. Pendulumのセットアップをする
Epicがデフォルトで提供しているPendulumモジュールを使うと、疑似Soft Body Simulationが簡単に実現できます。
Pendulumモジュールの詳しい仕組みについては、別の記事で解説しようと思うので、今回は深く触れません。
一応簡単な説明としては、PBD(Position Based Dynamics)の手法で、各Particleの相対位置(ある点からの長さと方向)の制約条件(Constraint)を作り、その条件を満たすようにParticleを移動させるというものです。
ここでは、ConstraintとPendulum Setupの設定内容の説明だけしておきます。
基本的に、対象Meshの形を保持することが今回は必要なので、Constraintは単純にMeshのPivot(Niagara Systemの原点)から各頂点へのベクトルにします。
そして回転に対応するため、ConstraintをNiagara SystemのRotation値に応じて回転させます。
Pendulum Setupでは、Pendulum LengthにConstraintの長さを入れ、Pendulum Rest AxisにConstraintを入れます。
Spring Driven Constraint(Tightness)という設定値が、疑似Soft Bodyの固さを制御しているので、外から変えられるようにUser Parameterを設定しておきます。
後のモジュールは、Pendulum Setupを入れた時点で追加しないとエラーになるので、Fix Issueで必要なものを追加していきます。特に設定値を変える必要もないので、説明は割愛します。
これで、Particleについては、疑似Soft Body Simulationができました。とても簡単ですね!