デフォーマー グラフ を使用して、Unreal Engine 内でカスタムのメッシュ変形を作成できます。カスタム デフォーマー グラフ アセットを作成した後、デフォーマー グラフ エディタ を、ブループリント ノード の固有セットとともに使用して、既存のメッシュ変形システム (モーフィング ターゲット や クロス シミュレーション など) を編集、または、あらゆる リニア スキン メッシュ に対する新しいメッシュ変形システムを作成できます。
このドキュメントでは、カスタム デフォーマー グラフを作成し、ランタイム時にひねりのメッシュ変形をスケルタルメッシュ キャラクターに適用する方法のサンプル ワークフローを示します。
前提条件
- Deformer Graph プラグイン を有効にします。メニュー バー で [Edit (編集)] > [Plugins (プラグイン)] の順に選択して [Animation (アニメーション)] セクションにある Deformer Graph を見つけるか、検索バー を使用して見つけます。このプラグインを 有効 にして、エディタを 再起動 します。

- プロジェクトに スケルタルメッシュ キャラクターが含まれています。サンプルワークフローの Unreal Engine マネキンを使用して、サードパーソン テンプレート でアクセスできます。
カスタム デフォーマー グラフ作成する
スケルタルメッシュ キャラクター の [Details (詳細)] パネルで、[Mesh Deformer (メッシュ デフォーマー)] プロパティを 有効 にしてから、[Deformer Graph (デフォーマー グラフ)] オプションをドロップダウン メニューから選択して、新しいデフォーマー グラフ アセットを作成します。

アセットを作成した後、Mesh Deformer プロパティでアセットを ダブルクリック して、デフォーマー グラフ エディタ を開きます。デフォーマー グラフの [Details] パネルで、Mesh プロパティのドロップダウン メニューを使用して、変更するメッシュを選択します。

[Pallet (パレット)] パネルから、スケルタルメッシュのコンポーネント バインディング をデフォーマー グラフの Update Graph (更新グラフ) に ドラッグアンドドロップ して、メッシュのデータを読み取ります。

次に、メッシュの位置データを書き直すために、Write Skinned Mesh ノードを Update Graph に追加し、スケルタルメッシュ のコンポーネント バインディングをつなげます。

Execute Skinned Mesh を追加して スケルタルメッシュのコンポーネント バインディング につなげて、メッシュ変形のドメインを設定します。このノードを選択し、Domain プロパティを Vertex オプションに変更します。

続いて、Scene Data ノードを追加し、スケルタルメッシュのコンポーネント バインディング につなげ、メッシュが占有するシーンに関する情報を抽出します。このワークフローでは Time データを使用し、ランタイム時にメッシュ変形を推進します。

スケルタルメッシュの頂点の位置を読み取るために、Skinned Mesh ノードを追加し、スケルタルメッシュのコンポーネント バインディング につなげます。このノードでは、キャラクター メッシュ頂点の Position、Tangent X、Tangent Y の座標が提供されます。

ここで、Custom Compute Kernel を Update Graph に追加します。Custom Compute Kernel は HLSL (上位レベル シェーダー言語) のプログラミングを使用して実際のメッシュ変形計算を実行します。

駆動する HLSL プログラミングを作成する前、またはグラフでノードを別のノードにつなげる前に、入力 および 出力 ピンを作成する必要があります。これは HLSL プログラムで使用され、メッシュ変形を実行します。Custom Compute Kernel の [Details] パネルで、次の各 入力 ピンを追加し、多様な Read ノードを使用して、スケルタルメッシュのコンポーネント バインディングから抽出した情報を利用します。

ピン | データ タイプ | ドメイン | 説明 |
---|---|---|---|
Num Threads |
Int Vector 3 | パラメータ | Num Threads ピンは、Execute Skinned Mesh ノードの出力ピンからメッシュ変形の ドメイン を受け入れます。 |
Twist |
Float | パラメータ | 定数 または 変数 値を使用して、この入力ピンは、メッシュ変形のひねりの最大角度を決定します。 |
Start |
Float | パラメータ | 定数 または 変数 値を使用して、この入力ピンは、Unreal Engine 単位 (cm) で、メッシュの Z 軸における、ひねりの開始位置を決定します。 |
End |
Float | パラメータ | 定数 または 変数 値を使用して、この入力ピンは、Unreal Engine 単位 (cm) で、メッシュの Z 軸における、ひねりの終了位置を決定します。 |
Time |
Float | パラメータ | この変数入力ピンは、ランタイム時にメッシュからゲーム時間を引き出します。 |
Position |
Vector 3 | Vertex x1 | この入力ピンは、ランタイム時に各メッシュ軸の位置を読み取ります。 |
Tangent X |
Vector 4 | Vertex x1 | この入力ピンは、X 軸の 接線 値を読み取ります。 |
Tangent Y |
Vector 4 | Vertex x1 | この入力ピンは、Z 軸の 接線 値を読み取ります。 |
Execute Skinned Mesh ノードの Num Threads 出力ピン を Custom Compute Kernel ノードの Num Threads 入力ピン につなげます。続いて、Execution Domain プロパティを Custom Compute Kernel の [Details] パネルの Vertex に設定します。

続いて、Custom Compute Kernel の [Details] パネルにある次の 出力 ピンを追加します。スケルタルメッシュに書き戻すための Write Skinned Mesh ノードに対して変形メッシュ データを出力します。

ピン | データ タイプ | ドメイン | 説明 |
---|---|---|---|
Out Position |
Vector 3 | Vertex x1 | メッシュ頂点の新しく変形した軸における位置を出力します。 |
OutTangentX |
Vector 4 | Vertex x1 | X 軸における変更した 接線 値を出力します。 |
OutTangentZ |
Vector 4 | Vertex x1 | Z 軸における変更した 接線 値を出力します。 |
アセットを 保存 して コンパイル します。

続いて、Custom Compute Kernel の [Shader Text Editor (シェーダー テキスト エディタ)] パネルにある [Declarations (Read-Only) (宣言、読み取り専用)] タブに、HLSL 宣言として、すべての入力と出力ピンが登録されていることを確認します。

[Decelerations (Read Only)] タブには次のテキストが含まれます。
Decelerations (Read Only)
// Parameters and resource read/write functions
int3 ReadNumThreads();
float ReadTwist();
float ReadStart();
float ReadEnd();
float ReadTime();
uint GetVertexCount();
float4 ReadTangentX(uint VertexIndex);
float4 ReadTangentZ(uint VertexIndex);
float3 ReadPosition(uint VertexIndex);
void WriteOutTangentX(uint VertexIndex, float4 Value);
void WriteOutTangentZ(uint VertexIndex, float4 Value);
void WriteOutPosition(uint VertexIndex, float3 Value);
// Resource Indexing
uint Index; // From SV_DispatchThreadID.x
続いて、[Shader Text Editor] パネルの [Shader Text (シェーダーテキスト)] セクションに、次の HLSL プログラムを入力し、スケルタルメッシュの頂点変形を実行します。
Shader Text Editor
if (Index > ReadNumThreads().x) return;
float3 Position = ReadPosition(Index);
float4 LocalTangentX = ReadTangentX(Index);
float4 LocalTangentZ = ReadTangentZ(Index);
float Twist = ReadTwist();
float Start = ReadStart();
float End = ReadEnd();
float Time = sin(ReadTime());
float posz = min(max(Position.z, Start), End) / (End-Start);
float theta = posz * Twist * 0.0174533 * Time;
float sint = sin(theta);
float cost = cos(theta);
float3 TwistPosition;
TwistPosition.x = Position.x * cost - Position.y * sint;
TwistPosition.y = Position.x * sint + Position.y * cost;
TwistPosition.z = Position.z;
float3 TangentX;
TangentX.x = LocalTangentX.xyz.x * cost - LocalTangentX.xyz.y * sint;
TangentX.y = LocalTangentX.xyz.x * sint + LocalTangentX.xyz.y * cost;
TangentX.z = LocalTangentX.xyz.z;
float3 TangentZ;
TangentZ.x = LocalTangentZ.xyz.x * cost - LocalTangentZ.xyz.y * sint;
TangentZ.y = LocalTangentZ.xyz.x * sint + LocalTangentZ.xyz.y * cost;
TangentZ.z = LocalTangentZ.xyz.z;
float4 TwistTangentX = float4(normalize(TangentX), LocalTangentX.w);
float4 TwistTangentZ = float4(normalize(TangentZ), LocalTangentZ.w);
WriteOutPosition(Index, TwistPosition);
WriteOutTangentX(Index, TwistTangentX);
WriteOutTangentZ(Index, TwistTangentZ);
メッシュ変形を計算するためのカスタム仕様の HLSL プログラムを追加した後、読み取り および 書き込み の各ノードを Custom Compute Kernel ノードの関連する 入力 と 出力 の各ピンにつなげます。

最後に、3 つの Float Constant ノードを [Pallet] パネルから Update Graph に ドラッグアンドドロップ して、カスタム関数の Twist、Start、End 値を設定します。1 つの Float Constant ノードを Custom Compute Kernel ノードで利用できる 3 つの 入力ピン それぞれにつなげます。Twist 入力ピン につながれた Float Constant ノードを値 180.0 に設定し、Start 入力ピン につながれた Float Constant ノードを値 0、End 入力ピン につながれた Float Constant ノードを値 100.0 に設定します。

関数の入力がどのように変更されるのかを確認するためにこれらの値を変更し、動的に変形します。定数値の代わりに、関数では、デフォーマー グラフ変数、リソース または アニメーション カーブ を入力として使用できます。
アセットを 保存 し、コンパイル して、[Preview Viewport (プレビュー ビューポート) パネルやレベルでリアルタイムに、メッシュがひねられるのを確認します。

カスタム デフォーマー グラフをレベルにあるどのキャラクターにも追加できます。これはメッシュを選択し、[Details (詳細)] パネルの [Deformer (デフォーマー)] セクションに移動して実行します。カスタム デフォーマー グラフをキャラクターに割り当てられます。これは Deformer Graph プロパティを 有効 にして、ドロップダウン メニューからカスタム仕様のグラフを選択します。
デフォーマー グラフ、デフォーマー グラフ エディタ、ブループリント ノード の詳細については、デフォーマー グラフ のドキュメントを参照してください。
カスタム デフォーマー グラフ ロジックでコントロールされるメッシュ変形に対するここで示したサンプルや他の応用例は、Content Examples にあります。
デフォーマー グラフの Custom Compute Kernels を利用する HLSL (上位レベルシェーダー言語) プログラミングの詳細については、Microsoft 社の上位レベルシェーダー言語のリファレンスおよびプログラミング ガイド を参照してください。
グラフ リファレンス
ここでは画像スライダを使用して、ワークフロー サンプルで使用される、完全なデフォーマー グラフ、Custom Compute Kernel の [Details] パネル、[Shader Text Editor] パネルを参照できます。



参照画像