Skip to content
第15回 GPU完結での衝突判定とパーティクル生成

3 / 4 着水位置に波紋と飛沫を配置する ​

このステップの目的

子が生成される通知と、子の位置を決めるデータを区別します。波紋の寿命を変え、広がり方と消え方の違いを確かめます。

通知だけでは位置は決まらない ​

GPU Eventで子を生成しても、どこへ置くかは子のInitializeで決めます。親が衝突した位置や、通知した親の位置を読み、子のPositionへ設定します。

波紋のInitializeにあるSet Positionの入力をたどってください。Get Collision Event PositionとGet Collision Event Normalを使っています。どちらもLocationはSourceです。Sourceは、この子を生成する通知を出した親のデータを指します。

値意味この作例での用途
collisionEventPosition親が衝突した位置波紋の中心
collisionEventNormal衝突した面の法線波紋を表面から少し離す方向
positionをSourceから読む通知した親の位置飛沫の生成位置

Get AttributeのLocationがCurrentなら、今処理している子自身の値を読みます。親から引き継ぐときは、Sourceを選んでください。

波紋の中心を確かめる ​

波紋の位置は、次の式で求めています。

text
波紋の位置 = 衝突位置 + 衝突面の法線 × 0.02

0.02は、水面と波紋の描画面が重ならないように離す距離です。水平な水面では法線が上向きなので、波紋は着水位置の少し上へ置かれます。波紋のVelocityは(0, 0, 0)で、生成した中心から移動しません。輪が広がる変化は、大きさの設定で作っています。

位置の接続が必要な理由を実験しましょう。まず、波紋のSet Positionへ入るAddの接続を外し、Positionを(0, 0.02, 0)にした結果を予想してください。

演習用Graphでこの変更を行い、保存してPlayします。波紋は生成されますが、雨の落ちる場所にかかわらず同じ中心に重なります。通知は届いていても、位置を引き継いでいない状態です。

停止したら、外したAddの出力をSet Positionへ接続し直してください。もう一度Playして、波紋がそれぞれの着水位置へ戻ることを確認します。

波紋の寿命と広がり方を変える ​

HierarchyのRainRipplesを選びます。Visual EffectのInspectorにある基準値は、ParentRateが10、ChildLifetimeが0.75です。Blackboardの既定値とSceneの設定が異なる場合があるので、この演習ではInspectorの値を基準にしてください。

ChildLifetimeを0.75から1.5へ変える前に、輪が消えるまでの時間と広がる速さを予想します。親の発生数は変えません。

波紋のUpdateでは、Set Size (Over Life)で寿命に沿って大きさを変え、その後のMultiply Sizeで全体を調整しています。OutputではAlphaを寿命に沿って下げます。同じカーブでも寿命が長くなると、変化にかける実時間が長くなります。

ChildLifetimeを1.5にしてPlayし、輪が残る時間と広がり方を比べてください。観察後は0.75へ戻します。輪を大きくしたい場合と、長く残したい場合では、変更する設定が異なることも説明しましょう。

飛沫の動きと比較する ​

飛沫は、GravityへつながるInitializeから生成します。Graph内の見出しはsibukkiです。Set Position (From Source)で通知した親の位置を受け取り、初速と重力で移動させています。

初速は2〜3、寿命は0.5〜1秒の範囲で変え、重力は(0, -9.81, 0)です。位置を保って広がる波紋と、位置そのものが変わる飛沫を見比べてください。二つの表示は、同じ着水をきっかけに別々のシステムで動いています。

チェックリスト
  • 通知が届くことと、子の位置が正しいことを分けて説明できる。
  • 波紋の位置の接続を戻し、着水位置に生成されることを確認した。
  • ParentRateを10、ChildLifetimeを0.75へ戻した。
  • 波紋の広がりと、飛沫の移動を区別できる。