Skip to content

第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ウィンドウで、次のファイルがあることを確かめてください。

text
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のモデルと、その形状から作成したSDFStanford University Computer Graphics LaboratoryStanford 3D Scanning Repository配布元の利用条件。出典を明記した研究利用と無料の再配布が認められ、商用利用には許諾が必要です。
Particle Textureまとめの円・輪の画像f_rafurafu-okiba配布元の利用規約v2。原文を素材と同梱しています。
Unity標準のVFX描画用アセットUnity TechnologiesVisual Effect GraphUnity Companion License。PackageのLICENSE.mdを参照してください。
2D Spriteの三角形画像Unity Technologies2D SpriteUnity Package Distribution License。PackageのLICENSE.mdを参照してください。

Stanford BunnyのモデルはAssets/ThirdParty/Stanford/Models、SDFと出典・利用条件はAssets/ThirdParty/Stanford/Lesson15にあります。

雨の円・輪の画像と利用規約はAssets/rafu systemにあります。