■ 概要
本記事ではUnityの 「VFX Graph」 を使用して「点群モーフィング」を実装した際のアプローチについて解説します。
VFX Graphでの点群モーフィングはリファレンスとして見たことはあったのですが、その具体的な実装方法について説明されているものが見つけられなかったため、自分で実装してみました。
■ 点群モーフィングとは
点群モーフィングとは、ある点群から別の点群へと形状を滑らかに変形させるコンピューターグラフィックス技術です。
プロセスとしては、2つの点群間の対応関係(どの点がどの点に移動するか)を計算し、その対応関係に基づいて段階的な補間を行うことで実現されます。
■ 環境
Unityバージョン:Unity2022.3.62f1
プロジェクトテンプレート:Universal 3D
今回は発光を表現する都合で、Bloom(ブルーム)のポストエフェクトを適用するためにURPのプロジェクトで実装しました。
URPレンダリングパイプライン以外(HDRP、ビルトイン)でもポストエフェクトを適用することは可能ですが、ポストプロセスの機能自体が一番簡素に統合されていて導入しやすいのが「URP」レンダリングパイプラインになります。
■ 制作物
Game画面:
■ 実装
実装したVFXファイル:
■ 実装のポイント
今回は点群モーフィングの実装部分、つまりは
・2つの点群間の座標を線形補間する
という実装のアプローチにフォーカスして解説します。
2つの点群の初期値(今回の実装における「星形の点群」と「雪の結晶の点群」)については、「Point Cache」を使用しました。
Point Cacheとは、点およびテクスチャにベイクされた属性を格納するアセットです。VFX Graphではそれを使用して、複雑なジオメトリの形状に沿ってパーティクルエフェクトを生成することができます。
Point Cacheの作成方法やVFX Graphの基本的な使用方法については↓の記事や動画が参考になるかと思います。これらの事前知識を前提として、点群モーフィングの実装について解説します。
① 2つの点群の初期値(座標)をAttributeにセットする
まずはPoint Cacheを元に生成された2つの点群の座標マップのデータを、「Initialize Particle」のコンテキスト内でAttributeにセットします。
・「星形の点群」の座標マップ → Custom Attributeの「StartPosition」にセット
・「雪の結晶の点群」の座標マップ → 「Target Position」Attributeにセット
1つ目の「星形の点群」の座標マップのデータをCustom Attributeである「StartPosition」にセットしているのがポイントです。「Position」Attributeにセットされた座標マップを取得してそのまま「StartPosition」Attributeにセットしています。
「Position」Attributeは最終的に出力されるパーティクルの座標を決定するAttributeであり、「Update Particle」のコンテキストで毎フレーム「Position」Attributeの値を更新することでモーフィングを実現します。
毎フレームの計算結果(補間後の座標)で「Position」Attributeを上書きしてしまうと、次のフレームで『元の位置(スタート地点)』の情報が失われてしまうため、1つ目の点群の座標を「初期値(不変の開始点)」として保持しておく目的で、Custom Attributeである「StartPosition」を作成して値をセットしています。
初期設定ではCustom Attributeは使用できないようになっており、「Create Node」等の検索窓で入力しても表示されません。(なんでだよ...)
↓の記事を参考に設定を変更して下さい。
Custom Attributeの使い方として、動画だと↓が分かりやすかったと思います。
② モーフィング(線形補間)
Attributeにセットした2つの点群の座標マップを取得して「Lerp」ノードで線形補間します。そして補間した座標を「Update Particle」のコンテキスト内で「Position」Attributeにセットします。
今回はアニメーションカーブをかけたかったため、このようにノードを組んで線形補間のパラメータとして使用してます。アニメーションが3秒間かけて実行され、それを繰り返すようにしました。
■ 最後に (感想)
今年も「Qiita Advent Calendar」に投稿する記事ということで、ちょっとだけクリスマスっぽい?アプトプットを意識して実装してみました。
VFX Graphをちゃんと触るのは今回が初めてだったのですが、仕様や処理の流れを把握するまでが割と大変だった印象...。(今回の実装もやってることとしてはそんなに難しくないんですけど、VFX Graphでどう実現させるか?ってところで地味に苦労がありました。)
ただ、手軽にリッチな表現ができるというのが良いですし、応用の幅もかなりあって面白いと思います。
ご覧いただきありがとうございました。




