UE5 Deformer Graph で Lattice Modifier を作る
「Unreal Engine (UE) Advent Calendar 2024 その3」1日目の記事です。
はじめに
Lattice Modifier for Unityが話題になっていて楽しそう!
Unreal Engine 5でも似たようなことがしたいのでやってみた!
ということで、どうやって実装したのか紹介し、その実装をGitHubで公開します。
今回メインで使う「Deformer Graph」の簡単な入門としても役に立つかもしれません。
環境
- Windows 10 64bit
- Unreal Engine 5.4.4
- Deformer Graph Plugin v0.9
実装方針:Deformer Graphを使う
最初はマテリアルのWorld Position Offsetで実装しようかと思いましたが、それだと対象メッシュのマテリアルを逐一改造しないといけないので辛いですね。
そこで、「Deformer Graph」を使ってみることにしました。「Deformer Graph」の特徴は
- メッシュを変形する処理を記述できる
- マテリアルとは別ものなので、対象のマテリアルを改造しなくてよい
- Skeletal Meshで使える
- Static Meshでは使えない(!)
です。
悲しいですが、Static Meshは今回はスコープ外とします😢
実装
Deformer Graphアセットの作成
コンテンツブラウザで右クリックして「Animation > Deformers > Deformer Graph」でアセットを作成します。
ダブルクリックして開くと編集できますが……何を書けばいいのかよくわからないですね。
そんなときは公式サンプルが「Engine > Plugins > Deformer Graph Content > Deformers」にあるので見てみましょう!
なるほど、メッシュの位置の情報とスケルトンのボーンの情報なんかを合わせてごにょごにょとHLSLで計算して結果を返す、みたいな感じですね。
この計算部分をLatticeに合わせて変形する処理にしてやればよさそうです。
…などと思いながら一通りサンプルを眺めていると、そのものずばりなものがありました。
ということで、上記の「DG_LinearBlensSkin」と「DG_Function_LatticeDeform」の中身を適当にコピーして新しいDeformer Graphにペーストします。
なんだか良さそうですね!
Skeletal Mesh Componentへの設定
Skeletal Mesh Componentに上記のDeformer Graphアセットを設定します。
レベル上に適当にSkeletal Meshを置いて、Detailsパネルから「Deformer Graph > Mesh Deformer」を有効化し、アセットを指定します。
が、これだけでは何も起こりません。変形のもとになるLatticeの情報を何もいじっていないので当たり前ですね。
そこで、まずはテストとしてDeformer Graph内で直接Latticeの値をいじって変形させてみます。
Deformer Graphアセットを開き、「Animation Attributes」ノードをクリックすると、どうやら「S_DG_LatticeData」構造体としてLatticeの情報を取ってきて計算に使っているようです。
このノードの中でDefault Valueが設定できるので、これを適当に変えてみます。
するとこうなりました。
これでDeformer Graph自体は機能していることがわかりました!
Deformer Graphへの構造体の渡し方
上記の作業の中で、Latticeの情報は「S_DG_LatticeData」構造体として、「Animation Attribute」から取ってくる形になっていることが察せられました。
なるほどよくわからん。が、まずは「S_DG_LatticeData」を開いて中身を確認しておきましょう。
さっきいじった通りの項目がならんでいますね。
…なんだか気になるコメントが書かれていることに気が付いたでしょうか。
Register this struct in Project Settings -> User Defined Struct Animation Attributes to use it as an animation attribute in Deformer Graph and Control Rig
ここから二つのことがわかります。
- プロジェクト設定をいじる必要がある。
- Control Rig で Animation Attribute を扱うことができる。
プロジェクト設定の変更
ということで、プロジェクト設定を開き「User Defined Struct Animation Attributes」で検索すると確かにそれっぽい項目が出てきたので、「S_DG_LatticeData」を追加してやります。
Control Rig で Animation Attribute を設定する
次に、新規Control Rigを作成して開きます。
右クリックして「Set Animation Attribute」と検索するとそれっぽいノードが出てきます。たぶんこれ使えば良さそうですね。
Forward Solveにつなぎ、パブリックな変数として追加した「S_DG_LatticeData」から値をセットするだけのシンプルな処理を作成します。
AnimBP から Control Rig に変数を渡す
Control RigをSkeletal Meshに適用する方法はいくつかありますが、一番簡単なのはAnim BP内で「Control Rig」ノードを使う方法です。
新規にAnim BPを作成し、Control Rigノードを追加して先に作成したControl Rigアセットを指定し、Inputとして「S_DG_LatticeData」の変数をピンとして公開し、そこにAnim BPのパブリックな変数として追加した「S_DG_LatticeData」をセットしてやります。
(ここではついでに歩行アニメーションも追加しておきました)
これで、「S_DG_LatticeData」構造体のデータを受け渡す AnimBP -> Control Rig -> Animation Attribute -> Deformer Graph
という経路の完成です!
S_DG_LatticeData構造体のデータの作成
あとはS_DG_LatticeData構造体のデータを適当に作り、上記のAnimBPに渡してやればOKです。
やり方はそれぞれだと思いますが、私はBPでアクタを格子状にもりもりと作成し、そこからS_DG_LatticeData構造体のデータを毎フレーム生成してAnimBPに流し込むという実装にしました。
ここでは 2x2x7 個のアクタを並べて格子としている
実装サンプル
本稿で述べた実装をGitHubで公開しています。
気に入っていただけた方は当社のアナログゲームを買って応援してください!600円とかなので!
Discussion