執筆バージョン: Unreal Engine 5.3
|
ChaosFleshでソフトボディをシミュレーションする方法を紹介します。
ChaosFleshを使用すると次の動画のような柔らかい物体を作ることができます。
今回で最後になります。
過去の記事のリンクは下記の通りです。
第1回
第2回
使い方
- 四面体を作成してシミュレーションさせる
- レベル上に配置したメッシュとコリジョンを判定
- SkeletalMeshにバインディング ← 今回はココ!
3.SkeletalMeshにバインディング
ソフトボディをシミュレーションすることが出来るようになりました。
次はこれをSkeletalMeshの骨に追従させ、SkeletalMesh自体も変形させます。
これをすることで冒頭の動画のようなことが出来るようになります。
まずは表示用に使用するSphereの形をしたSkeletalMeshを作成します。
SkeletalMeshEditingToolsを有効化してエディターを再起動します。

SkeletalMeshEditingToolsを有効化
表示用のSkeletalMeshの元となるStaticMeshをEngineのフォルダからコピーしてきます。
EngineのフォルダからSphereアセットをコピーしました。

EngineフォルダからSphereをコピー
コピーしたSphereを右クリックしてSkeletalMeshを作成します。

StaticMeshをSkeletalMeshに変換

SkeletonはCreate Newを選択
作成したSkeletalMeshを開いて編集します。
Root骨の位置が下の方にあるので位置を中央に持ってきます。
Editing ToolsからSkeleton→Edit Skeletonを選択してRootを選択します。

Rootを選択
次にLocationのZを0に設定して、画面下部のAcceptを押します。
これで編集内容が反映されて、Rootの位置が中心にきます。

Rootを選択した状態でLocationのZを0に設定
輪郭のポリゴンが目立たなくするためにポリゴン数を増やしてみます。
Deform→Displaceを選択してDisplace Intensityを0、Subdivisionを1に設定します。
設定し終えたらAcceptを押して編集内容を確定させます。
Subdivisionで増えた頂点数が左下に表示されています。あまり増やしすぎると重くなります。

頂点数を増やした
ここからは作成したこのSphereのSkeletalMeshに以前作成したソフトボディのシミュレーション結果を適応させます。
FleshAssetを編集します。
新たにSkeletalMeshノードを追加して、作成したSkeletalMeshを割り当てます。

SkeletalMeshの割り当て
KinematicInitializationで四面体をSkeletalMeshの骨に追従させることができます。
Radiusで骨からの影響範囲を設定できます。

KinematicInitializationを追加した様子
追従してほしい骨を設定します。
SkeletalMeshBoneノードでボーン名からボーンのIndexを取得できます。今回はRootをボーン名に入力しました。

SkeletalMeshBoneを追加した様子
表示用のメッシュを設定
GenerateSurfaceBindingsノードで四面体のシミュレーション結果をどのメッシュに反映させるか設定します。

GenerateSurfaceBindingsを追加した様子
GenerateSurfaceBindingsからSetFleshDefaultPropertiesにつなぎます。

FleshAssetのシミュレーション結果をSkeletalMeshに適応するために少し設定が必要なため、Actorを作成して設定をBPで書きます。
コンテンツブラウザで右クリックメニューからBlueprintを選択してActorのBlueprintを作成します。

ActorでBPを作成
次のコンポーネントを左上のAddから追加します。
- SkeletalMeshComponent
- DeformableSolverComponent
- FleshComponent

SkeletalMesh、DeformableSolver、Fleshを追加した様子
FleshComponentとDeformableSolverComponentは以前レベルに配置したFleshActor、DeformableSolverActorと同じ機能を持ちます。
FleshComponentと同じBP内にSkeletalMeshがあるとシミュレーションの結果を渡せるようです。
FleshComponentにFleshAssetを設定します。

SkeletalMeshのみ表示したいのでFleshAssetを非表示にします。

FleshのVisibleのチェックを外した
作成したSphereのSkeletalMeshアセットを設定します。

SkeletalMeshアセットを設定
FleshからEnable Simulationノードを追加します。
このノードでどのSolverを使ってシミュレーションするかを決定します。

Enable Simulationを追加した様子
次にSkeletalMeshを変形させるための設定を行います。
SkeletalMeshの変形にはDeformerGraphを使用します。
SkeletalMeshを選択して詳細パネルからMesh DeformerにDG_FleshDeformerを割り当てます。
(DG_FleshDeformerはChaos Fleshプラグインに含まれているアセットです。表示されない場合は右上の歯車マークからShow Plugin Contentにチェックを入れてください。)

DG_FleshDeformerを割り当てる
次にDeformerにパラメーターを渡すためにMesh Deformer InstanceからOptimus Deformer Instanceにキャストします。

Cast To OptimusDeformerInstanceを追加した様子
キャスト先からSet Variableを追加して以下の2つを設定します。
SimToRender:SkeletalMeshの位置や回転、スケールを調整できます。
Amount:適応する量

Set Variable(Transform)とSet Variable(Float)を追加した様子
これらのパラメーターですが、SkeletalMeshに設定したDeformerアセットを開くとどのようなパラメーターがあるかわかります。

Engine/Plugins/ChaosFlesh/Deformers/DG_FleshDeformer を開いた様子
このBPをレベル上に配置して実行してみます。
SkeletalMeshの骨に追従しており、変形もしていることがわかります。
次にレベル上メッシュとのコリジョン判定を行えるように設定します。
基本的に流れは同じですが、BPから設定を行う必要があるため設定方法が少し異なります。
設定方法は2種類、DeformableCollisionsComponentをBPに追加する方法と、レベル上に配置したDeformableCollisionsActorを使う方法が考えられます。
今回はすでにレベル上にDeformableCollisionsActorとDeformableSolverActorを配置して設定済みなのでこれを再利用します。
レベル上のSolverを使用するので、BP側のSolverを削除します。

DeformableSolverを削除した様子
次にレベル上のSolverを設定出来るように変数を作成します。

変数を新規に作成
変数の型をDeformable Solver ActorのObject Referenceに変更します。

変数の型を変更
Instance Editableにチェックを入れます。(有効になっていると変数の横に目玉アイコンが付きます。)
この状態だとレベルにこのBPを配置したときにこの変数を設定できるようになります。

Instance Editableを有効化
次にこの変数からSolver Componentを取得してEnable Simulationにつなぎます。

作成した変数からSolver ComponentをGet

Solver ComponentをEnable Simulationに接続
これでこの変数に設定されたSolverを使用する事ができます。
次にこのBPをレベル上に配置して、詳細パネルからSolverを設定します。

レベル上にあるSolverを選択
コリジョンを判定出来るようになりました。
おまけ
表示用のメッシュとは異なる形状の四面体でシミュレーションを行う事もできます。
形状によってパフォーマンスや挙動が異なってくるため、どの形状が最適なのかは一概には言えません。
ちなみに上の2つはどちらもFleshPropertiesは同じ設定です。

FleshProperties
注意点
最後にChaos Fleshを使用する際の注意点をいくつか紹介します。
バインディングしたSkeletalMeshの陰影がおかしい
WorldNormalが骨を元に計算されるため、FleshAssetと位置がずれた際に正しくないNormalになり、陰影がおかしくなることがあります。

残像が残る
ChaosFleshに限らずDeformerGraphでSkeletalMeshを動かしているとVelocityPassが書き込まれないため、TSRでゴーストが発生したり、モーションブラーが効かなかったりします。
ShowFlag.VisualizeMotionBlur 1 を実行した様子
ちなみにElectricDreamで使われていた車両のタイヤはDeformerGraphではなくマテリアルのWPOで動かしているようです。
影が残る
r.Shadow.Virtual.Cache 0で消せます。

本来は無い部分に影が残っている
参考サイト
https://dev.epicgames.com/community/learning/tutorials/BEby/unreal-engine-chaos-flesh
https://dev.epicgames.com/community/learning/tutorials/BEZV/unreal-engine-electric-dreams-tire-deformation
https://docs.unrealengine.com/5.3/ja/chaos-flesh-overview/