Skip to content

改訂前の参考解説

このページは改訂前の教材です。現在の授業の回番号・内容は、後期の授業計画で確認してください。

第02回 速度場とCurl Noiseによる流れ

4 / 4 流れのまとまりと再現条件 ​

このステップの目的

このステップでは、粒子の動きを同じ条件で比較し、速度場の働きと表示上の問題を切り分けます。

一定時間を見て流れを判断する ​

静止画だけでは、粒子が渦に沿って動いているか、独立した方向へ散っているかを判断できません。同じカメラで数秒間の動きを観察してください。

最初は、小さな半透明の粒子を使います。強い発光や大きな粒子によって軌道が読めなくなる場合には、AlphaとSizeを下げてください。

次の順で三つの状態を比較してください。

  1. Windを(1, 0, 0)、FlowStrengthを0にして、風だけを確認します。
  2. Windを(0, 0, 0)、FlowStrengthを0.6へ変え、渦だけを確認します。
  3. Windを(1, 0, 0)へ戻し、FlowStrength 0.6のまま合成した流れを確認します。

三条件ではFrequencyを0.25、Noiseへ渡す時間の移動量を0へ固定します。SceneをPlayし直し、再生後5秒の同じ区間を比べます。この三条件の確認後、速さか細かさの比較では一度に変える値を一つにします。

比較時の条件をそろえる ​

カメラ、発生位置、発生数、寿命、ランダムシード、再生開始からの経過時間をそろえてください。一度に変更する操作値を一つに絞ると、結果を説明しやすくなります。

この比較は、同じ環境で設定の違いを見分けるためのものです。GPUの実行環境や更新間隔まで異なる条件で、すべての粒子が完全に同じ軌道を通ることを保証するものではありません。

観察した状態先に確認する箇所
粒子が発生位置にとどまります。Set Velocityの入力とUpdate Positionの有効状態を確認します。
粒子が毎回飛び跳ねるように動きます。現在位置の代わりに毎回変わる乱数をCoordinateへ渡していないか確認します。
速度が増え続けます。Set VelocityのCompositionがAddになっていないか確認します。
粒子が不自然に遅くなります。速度へDelta Timeを二重に掛けていないか確認します。
粒子群が画面の端でまとめて消えます。Boundsが移動する範囲を含んでいるか確認します。

寿命と移動範囲からBoundsを考える ​

粒子は発生位置から移動するため、Boundsには発生範囲だけでなく、粒子が生きている間に到達する範囲も必要です。

例えば、X方向の速度が1で寿命が8秒なら、一定の風だけでも粒子はX方向へ8進みます。渦を加えると、ほかの軸にも移動します。風だけで届く範囲を確認した後、渦を加えた状態で範囲を見直してください。

最初の設定では、手動BoundsのCenterを(0, 0, 0)、Sizeを(40, 40, 40)程度にして、範囲不足による消失を切り分けられます。この値は移動範囲の保証値ではありません。Wind、FlowStrength、Lifetimeを変更した場合には、粒子の到達位置を確認し、必要な範囲へ調整してください。

Boundsを際限なく大きくすると、画面外にあるシステムも処理対象に残りやすくなります。表示が途切れないことを確認したうえで、不要な範囲を狭めてください。

全体の接続を確認する ​

場所基本構成
SpawnConstant Spawn Rateが、粒子を継続的に発生させます。
InitializeWorld空間の発生位置、寿命、大きさなどを設定します。
UpdateのOperator現在位置から3DのValue Curl Noiseを読み、FlowStrengthを掛けてWindを足します。
UpdateのBlock一つのSet Velocityが、合成した速度をSetで書き込みます。
Updateの自動処理Update Positionが、速度と経過時間から位置を更新します。
Output粒子の軌道と群れのまとまりを読める大きさで表示します。

Update Positionによる位置更新は、Update内のBlockの後に行われます。Blockで設定した速度が、その更新の移動へ使われる関係を確認してください。処理順序は、UnityのUpdate Contextの説明でも確認できます。

ほかの表現への使い方を考える ​

この仕組みは、空気中を流れる微粒子、魔法のエネルギー、吹き流される火の粉などへ応用できます。粒子画像を交換するだけでなく、発生範囲、寿命、主な流れ、局所的な渦の大きさを、表したい現象に合わせます。

粒子を光らせても、その粒子が周囲の物体を照らすライトになるわけではありません。また、速度場は、霧の中で光が散乱する計算も担当しません。粒子の移動、粒子の描画、周囲への照明を別の役割として整理してください。

保存前の復元 ​

Wind (1, 0, 0)、FlowStrength 0.4、Frequency 0.25、Rate 1000、Lifetime 8、Size 0.04へ戻します。時間でNoiseの座標を動かした場合は移動速度を0へ戻し、基本の静止した場を残します。Playを終了してカメラを比較開始時の位置へ戻し、GraphとSceneを保存します。

条件を変えた確認 ​

ある位置のCurl Noise出力が(0,2,0)、FlowStrengthが0.5、Windが(1,0,0)なら、Set Velocityへ渡す速度を求めてください。0.1秒の1回の位置更新ではどれだけ移動しますか。

考え方の確認

速度は(1,1,0)、1回の移動量は(0.1,0.1,0)です。次の更新では移動後の位置からNoiseを読み直すため、同じ速度が続くとは限りません。Delta TimeはUpdate Positionが使います。

チェックリスト
  • 風だけ・渦だけ・両者の合成を同じ条件で比較できます。
  • 速度の設定と自動の位置更新を接続上で説明できます。
  • 寿命と移動速度を踏まえてBoundsを確認できます。
  • 流れを別の表現へ使う際に変更する項目を挙げられます。