パーティクル・軌跡

速度方向への整列

Velocity Alignment

粒子の長軸を進む向きに合わせる。

10 / 10

インタラクティブデモ

デモを準備しています…

速度方向への整列

ドラッグで視点を回転、Ctrl(⌘)+ スクロールでズーム。タッチ操作は 2 本指です。

ひとことで

粒子の長軸(向き)を、進んでいる方向(速度ベクトル)に合わせる手法です。細長い粒子が流れの向きを指すので、風や水流、渦の形が一目で読み取れるようになります。ストレッチビルボードが画面上での伸ばし方なのに対し、こちらは 3D の向きそのものを速度に合わせる考え方で、メッシュパーティクルにも板にも使えます。

ゲームでの使いどころ

  • 竜巻・つむじ風:巻き上げられた木片や葉が渦に沿って流れる。
  • 雨・雪の吹き付け:風に流される雨粒が斜めに向く。
  • 魚群・虫の群れ:個体の向きを進行方向に合わせる(ボイドの描画)。
  • 矢・槍・破片:放物線を描いて飛ぶ矢の向きを常に接線方向へ。

しくみ

粒子の基準となる前方向を f\mathbf{f}(例えば +Z+Z)とし、速度 v\mathbf{v} の単位ベクトル v^\hat{\mathbf{v}} へ回す回転(四元数)を求めます。

q=fromUnitVectors(f,  v^)q = \text{fromUnitVectors}(\mathbf{f},\; \hat{\mathbf{v}})

これは回転軸 f×v^\mathbf{f} \times \hat{\mathbf{v}}、回転角 arccos⁡(f⋅v^)\arccos(\mathbf{f} \cdot \hat{\mathbf{v}}) の回転です。これだけでは長軸まわりのねじれ(ロール)が決まらないので、必要なら「上方向」も指定して姿勢を完全に決めます(lookAt と同じ考え方)。

さらに、速さに応じて長軸方向に伸ばすと、ストレッチビルボードと同様に速度感が出ます。

scale=(1,  1,  1+k ∥v∥)\text{scale} = (1,\; 1,\; 1 + k\,\lVert \mathbf{v} \rVert)

実装のポイント

  • 速度が 0 に近いとき:向きが決まらず、ぶるぶる震えます。速さが閾値以下なら前フレームの向きを保つか、向きを滑らかに補間します。
  • 向きの急変を和らげる:速度の向きが急に変わると粒子がパッと回転します。回転を球面線形補間で追従させると自然です。
  • GPU での計算:GPU パーティクルでは、頂点シェーダー内で速度から基底ベクトル(前・右・上)を作り、頂点を変換します。

つまずきやすい点

  • 真上・真下への速度:上方向ベクトルを固定して姿勢を作る方法では、速度がその上方向と平行になると外積が 0 になり、向きが不定になります。
  • 遅い粒子まで整列させる:ほとんど止まっている粒子を無理に整列させると不自然です。速さに応じて整列の強さを変えることもあります。
  • ランダム回転との組み合わせ:葉のようにひらひら回るものは、完全な整列よりも「整列 + 長軸まわりの回転」のほうが自然です。

デモで試すこと

  1. 「粒子の向き」をランダム(固定)に切り替えると、同じ速度で渦を巻いているのに、木片が散らかって見え、流れが読み取れなくなります。
  2. 速度方向へ整列に戻すと、木片が渦に沿って並び、竜巻の回転がはっきり見えます。
  3. 「速さに応じた伸び」を上げると、外側の速い木片ほど長く伸び、勢いが強調されます。

参考資料

Unity Particle System Renderer ↗

分野全体の資料で、この項目を直接扱っているとは限りません。