3 / 4 ディゾルブへの応用
メッシュとパーティクルで同じ消滅の境界を使い、境界から粒子が離れていく仕組みを確認します。
毛を表面に固定できたら、同じ取得方法を消滅の表現へ応用します。
このページは応用課題です。まず配置済みの見本を観察し、メッシュと粒子が受け持つ処理を分けて考えましょう。
生成時の情報をメッシュから得る
消滅の粒子にもSample MeshのPositionとNormalを使います。
Positionは発生位置に、Normalは表面から離れる方向の初速に接続します。
生成位置 = メッシュ表面の位置
初速 = メッシュ表面の法線 × NormalSpeed消滅の粒子には、Updateによる位置の更新が必要です。
Initializeで与えた初速で移動し、UpdateのForceやTurbulenceが生成後の動きを変えます。
初速と外力の違いは、第13回「Turbulence・Force・Linear Dragを比較する」を参照してください。
メッシュのすべての表面からパーティクルを出すと、既に消えている場所からも粒子が飛び出してしまいます。
取得した位置がパーティクル生成可能かは、生成の際に判定します。
見本では、位置の高さとノイズからマスク値を求めます。
メッシュで使用しているディゾルブの境界判定と同じ計算をVFX Graphでも扱うことで、境界付近の粒子生成をメッシュの消滅と一致させることができます。
uv = position.xz × 0.75 + 0.5
mask = position.y × 0.5 + 0.2 × (noise(uv) - 0.5)positionはウサギのローカル座標、noiseは同じノイズ画像のR成分です。
高さ2のウサギでは、Yに0.5を掛けると高さの範囲がおよそ0〜1になります。
メッシュのディゾルブとの併用
Playを停止してMeshDissolveShowcase.unityを開き、再生してください。
約1秒の待機後、3秒かけてウサギが下から消え、その後に粒子が残ります。
Spaceキーで最初から再生できます。
VFX Graphでは、まず表面から生成位置の候補を選び、その後に条件に合わない粒子のaliveをfalseにします。
Shaderと同じ計算で、メッシュ状のマスク値を求め、VFX Graphの粒子生成の判定に使います。
| 処理する場所 | 判定 | 結果 |
|---|---|---|
| メッシュのShader | mask - threshold < 0 | その場所を描画しない |
| VFX GraphのInitialize | abs(mask - threshold) < BoundaryWidth | 境界付近の粒子を生存させる |
CandidateRateは、この候補を1秒当たりに生成する数です。
境界の条件を満たして実際に見える粒子数とは異なります。
図を準備しています…
配布済みのMeshDissolveDemoでは、Shaderの_ThresholdとVFX GraphのDissolveThresholdに同じ値を渡しています。
しきい値を-0.2から1.2まで進めることで、ノイズによる範囲の広がりも含めて全体を消します。
生成後の粒子には、この境界判定は適用しません。
一度生まれた粒子は表面から離れ、寿命で消えるまで動き続けます。
注意点
ここでノイズ画像は明るさの表示ではなく、判定用の数値として使います。
サンプルのdissolve-noise.pngはsRGBを無効にし、圧縮とMip Mapを使わず、両方の処理で同じ画像を参照しています。
メッシュと粒子の境界を一致させるには、しきい値だけでなく、座標空間、ノイズ画像、ノイズを読む座標、マスクの計算も揃えなければなりません。
BoundaryWidthを小さくすると発生する帯が細くなり、条件に合う候補も減ります。
細い境界で粒子が途切れる場合は、候補数と帯の幅の関係を確認してください。
候補数を増やすと、表示されない粒子の判定にも処理が必要になります。
また、境界を速く動かすと、フレームの間に境界が通り過ぎ、粒子が出ない場所が生じることがあります。
帯の幅、消える時間、候補数を一つずつ変え、どの条件で途切れるかを調べましょう。
発生を止めた後も、既に生まれた粒子は残ります。メッシュが消えた時点でVisual Effectごと非表示にすると、余韻も途切れます。見本のように発生を停止し、残った粒子は寿命で消す構成にします。
- ShaderとVFX Graphが同じマスクとしきい値を使う理由を説明できる。
- 境界で生成する判定と、生成後の粒子の移動を区別できる。
- CandidateRateと、実際に見える粒子数の違いを説明できる。