第15回 GPU完結での衝突判定とパーティクル生成
例えば、雨粒が水面に触れると、その場所に波紋と飛沫が生まれます。
こうしたエフェクトを作成する際、通常はCPU側で衝突判定を行い、その結果に応じてパーティクルを生成します。
ですが、GPU上で衝突判定を行い、その結果に応じてパーティクルを生成することも可能です。
ある程度条件を選びますが、CPUでの衝突判定に比べて大幅に高速、かつGPU完結で処理できます。
今回はGPUでの衝突検出と、その結果に応じたパーティクル生成の方法を学びます。
この回で作るもの
完成見本の動画で、衝突する前と後の変化を見比べてください。雨では親の粒子が消え、SDF衝突では親が跳ね返ります。どちらも、衝突に応じて子の粒子を生成します。
| 作例 | 親の粒子 | 衝突後に生成する子の粒子 |
|---|---|---|
| 雨粒と波紋 | 水面で消える雨粒 | 広がる波紋と、上へ跳ねる飛沫 |
| SDF衝突 | ウサギの形に沿って反射する光の粒子 | 接触した場所を短く照らす光 |
配布教材の準備
Unity 6.6(6000.6.0f1)、URP・Visual Effect Graph 17.6.0を使用します。
取得・展開とUnity Hubへの登録は、共通の準備手順を参照してください。
続いて第15回のPackageをダウンロードし、共通プロジェクトへImportしてください。自分のプロジェクトを使う場合は、2D Sprite 1.0.0も導入します。
Projectウィンドウで、次のファイルがあることを確かめてください。
Assets/UNSLOW/EffectPractice/Lessons/SecondTerm/15_CollisionEvents/
Scenes/
RainRipples.unity
SDFCollision.unity
Effects/
RainRipples.vfx
SDFCollision.vfx
Prefabs/
RainRipples.prefab
SDFCollision.prefab雨粒の例はScenes/RainRipples.unityを開き、Playしてください。
水面に届いた雨粒が消え、その近くに波紋と飛沫が発生します。
Scenes/SDFCollision.unityでは、曲面に沿った反射と衝突時の光を確認できます。
この回のゴール
- 衝突した親の動きと、GPU Eventで生成する子の表示を区別できる。
- 衝突位置や親の位置を使い、子を適切な場所へ配置できる。
- 平面とSDFの衝突を比較し、発生数・寿命・反射の設定を調整できる。
制作の手順
完成条件
通知を止めたときと位置の引き継ぎを外したときの違いを確かめてください。波紋の寿命か飛沫の数を一つ変更し、予想と表示の違いを説明します。
SDF作例では反射の強さを変え、親の反射と子の発光が別の処理であることを確認します。最後は各ページの基準値へ戻し、二つの作例を再生できる状態にしてください。
ライセンス
| アセット | 作者 | 提供元 | ライセンス |
|---|---|---|---|
| Stanford Bunnyのモデルと、その形状から作成したSDF | Stanford University Computer Graphics Laboratory | Stanford 3D Scanning Repository | 配布元の利用条件。出典を明記した研究利用と無料の再配布が認められ、商用利用には許諾が必要です。 |
| Particle Textureまとめの円・輪の画像 | f_rafu | rafu-okiba | 配布元の利用規約v2。原文を素材と同梱しています。 |
| Unity標準のVFX描画用アセット | Unity Technologies | Visual Effect Graph | Unity Companion License。PackageのLICENSE.mdを参照してください。 |
| 2D Spriteの三角形画像 | Unity Technologies | 2D Sprite | Unity Package Distribution License。PackageのLICENSE.mdを参照してください。 |
Stanford BunnyのモデルはAssets/ThirdParty/Stanford/Models、SDFと出典・利用条件はAssets/ThirdParty/Stanford/Lesson15にあります。
雨の円・輪の画像と利用規約はAssets/rafu systemにあります。