未来を創る、テックコミュニティー

代表技術通信~Unityで点群表示、Oculus Questで表示⑧ Visual Effect Graph再入門

草場代表
2020/09/23

こんばんは。代表の草場です。

様々なウェブサイトのおかげで、とりあえずDMM.make AKIBAの点群データを動かすことができました。
【点群】【VFX】DMM.make AKIBA 動かしてみた

もっとVFXのことを理解する必要があるので、@tan-yさんの記事「Visual Effect Graph 入門」と、Keijiro Takahashiさんの動画「パーティクルエフェクトが超進化する! Visual Effect Graph の基礎と応用 – Unite Tokyo 2019」にて再入門しました。今回は動画の内容です。

まず、VFXの特徴についてです。
①GPUで実行される。
Compute Shader使っているのでGPUの性能を100%、活かすことができます。
②ノードベースのGraphシステム
ノードを作って線でつなぐことで、パーティクルの見た目等をデザインできる。

簡単に言うと、よりパワフルに、より使いやすくなったとのことです。Unity史上最高傑作、とのこと。

導入さて、導入方法に関しては、Keijiroさんの動画ではHDRPでプロジェクト作成して導入しています。今回は「代表技術通信~Unityで点群表示、Oculus Questで表示⑤ Visual Effect Graphについて」の通り、軽く使えるようにセットアップしました。

さて、Unityにて、新しくSceneを作ります。Visual Effect Graphを作成します。Asset>Create>Visual Effect>Visual Effect Graph、名前はforstudyとします。こちらをSceneのヒエラルキーに入れます。そして、forstudyのInspectorでEditクリック。VFXが出てきます。復習ですが、
Spawn パーティクルを生み出す
Initialize パーティクルを初期化するためのノード
Update パーティクルを毎回更新して挙動を作る
Output パーティクルをレンダリングする。はじめはQuad。メッシュ、Lineとかいろいろある。
このコンテキストノードの中に、ブロックという箱をどんどん入れていきます。

はじめの状態ではSpawnのConstan Spawn Rateを使って、1秒間に16個のパーティクルを生成しています。

さて、Initializeで、x,y,zを0,0,0に設定し、原点に初期化します。パーティクルに速度を加えるために、Initializeノード内で右クリック、Create Nodeでノードを追加します。set velocityブロックです。すると初期速度が出ます。

さらにパーティクルの動きをランダムにします。Initializeノード内のset velocityのチェックボックス外して、新たにset velocity randomブロック作成します。A(最小値)を1,1,1に、B(最大値)を-1,-1,-1に設定すると、パーティクルがランダムに動きます。

次に、パーティクルの寿命を設定します。Initializeノードにset lifetimeブロックを追加します。ここを1と設定すると1秒でパーティクルが消える。以下、10秒バージョンです。

パーティクルの消え方が、パッパッと消えてかっこ悪いので、Alphaを使って、スッと消えるように設定します。パーティクルの見た目を変えるので、レンダリングするOutput ノードをいじります。Outputノードに、Set apha over lifeブロック追加します。
ここで、なんかパーティクルが異常に小さくなったので、Set size ブロック追加しました。
さて、Alphaをいじります。このあたりの詳細はよくわからずです。動画ではClamped autoをオンにしていました。

これでalpha使って、パーティクルがスッと消えました。

せっかくなのでUpdateも使います。パーティクルが下に落ちるようにします。Updateノード内で、forceブロックを追加します。これでパーティクルに力を加えられるようになります。。例えば、Y方向に力を加えます。

このような形で、ノード内にブロックを追加して、パーティクルの挙動を変えます。さらに、このノードの外にノードを追加してつないでいくと、さらに複雑な処理が可能となります。
例として、パーティクルのY軸座標に応じて色が変化するようにします。
ここで、形をわかりやすく球に変更しました。
位置に合わせて色の変化つけるので、Get Potisionノードを追加します。VFXの何もないところで右クリック、Create Node。これでXYZ座標が取得できるようになります。色を付けるのにHSV使ったほうがいいので(なぜ?)、HSV to RGBノードをさらに作ります。さて、Update Particleにset colorブロック作ります。Get PotisionのY軸とHSV to RGBのXを結び(なぜ?)、HSV to RGBのrgbとset Colorを結ぶと、、、色変わった!

HSV to RGBでは値が0から1までしか設定できないので、1を超えると色が赤に張り付くのでかっこ悪いです。こういう時はFractionalノード使います。0から1の小数点以下の値を取り出してくれるノードです。これをつなぐと0から1の間で、値がループしていい感じになります。

パーティクルの数がまばらなので、SpawnのRateを上げます。GPUなので10万点とかも余裕です。

やりすぎなので、1万点に。寿命が1秒で決まり切っているので面白くない。そこで、InitializeノードのLife Timeブロックをオフになり、Life time randomブロックを加えて、最小2、最大3に設定します。まばらになりました。

さて、パーティクルもっと初期値で小さくします。InitializeノードにSet Sizeブロック加え、サイズを0.025に設定します。パーティクルらしくなりました。

現状、等加速度運動で面白くないので、乱流を加えます。Updateノードにturbulenceブロック加えます。乱流のパターンが大きいとかっこ悪いので、Scaleを0.5 0.5 0.5に。あとは良しなに。設定がよくわかりません。

Turbulenceはパターンが固定していて面白くないです。Total Time(Operator Buildinのほう)ノードを作ると現在時刻が取れます。作成。これだと動きが早すぎるのでMultipyノード作ってBを0.5に設定。そしてTurbulenceブロックのYとつなぐと、うねります。

いい感じ。
色が七色だとダサいので、UpdateノードのSet Colorはいったんオフにします。色を自分で作りましょう。Outputノードに、Set Color Over Lifeブロックを追加。Color Mode をColorに変更。良しなにいじります。ここら辺センスですね。うまくできず、、。

よし!あとは外部(例えばUnityのInspector)からいじれるようにします。VFXのタブのBlackboardクリック。プラスボタン押してfloatを選びます。今回はSpawn Rateをいじるので名前はSpawn Rateとします。現在、Rateを10000に設定しているので、Rangeにチェック入れて最大を10000にします。それをVFXの何もないところにドラッグ&ドロップ、そしてSpawnとつなぎます。これでパーティクル数のレンジが、バーでいじれるになります。さらに、Exposeにチェックを入れると、Unity画面のInspectorの中からいじることが可能になります。

いったん終了!
あとは動画の後半を見て、Point Cacheを良しなにいじりたい。。。KeijiroさんのGitHubがおすすめです。

この記事を書いた人
草場代表
エディター