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を選んでください。
波紋の中心を確かめる
波紋の位置は、次の式で求めています。
波紋の位置 = 衝突位置 + 衝突面の法線 × 0.020.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へ戻した。
- 波紋の広がりと、飛沫の移動を区別できる。