This explanation is currently available in Japanese.
ひとことで
砕ける波や滝、船のへさきで生まれる白い水を、飛沫・泡・気泡という 3 種類の粒子として描く方法です。同じ粒子が水面との位置関係で役割を変え、空中では飛沫として放物線を描き、水面に落ちると泡として漂い、水中では気泡として浮かび上がります。
ゲームでの使いどころ
- 荒れた海:波頭が崩れる所の白波、しぶき、波が引いたあとに残る泡の筋。
- 船や物体の周り:へさきが波を切る所、スクリューの泡、物が落ちたときの水柱。
- 川や滝:岩に当たる急流、滝つぼの泡と飛沫。
- 流体シミュレーションの仕上げ:PIC・FLIP などで計算した水に、細かすぎて計算できない白い水を後から足す、という使い方が映画やゲームで定番です(Ihmsen らの手法)。
しくみ
- どこで生まれるか:水が激しく動く所から生まれます。よく使われる目安は次の 3 つです。
- 3 種類に分けて動かす:各粒子について、その位置の水面の高さと比べます。
- 飛沫(水面より上):重力と空気抵抗だけで飛ぶ。生まれたときの水の速さを引き継ぐので、波の進む向きへ飛ぶ。
- 泡(水面付近):水面に張り付き、水の流れに運ばれる。少しずつ消える。
- 気泡(水面より下):浮力で浮かび、水の抵抗で横の動きは止まる。水面に着くと泡になる。
- 寿命と消え方:泡は数秒かけて消え、気泡は水面に着くまで、飛沫は着水するまで、と種類ごとに寿命の扱いを変えます。
大事なのは、種類を最初に決めずに、毎フレーム水面との位置で決め直すことです。これで、飛沫が着水して泡になり、気泡が浮かんで泡になる、という移り変わりが自然に起こります。
実装のポイント
- 描き方を分ける:飛沫は小さく明るい粒(動きが速ければ速度方向に伸ばす)、泡は水面に貼り付く平たい板、気泡は水中で半透明、と見た目を変えると説得力が増します。
- 泡はテクスチャでも:粒子を大量に出す代わりに、泡の量を水面のテクスチャに描き込み、時間とともに薄めながら流す方法もよく使われます。遠くの海はこちらが軽量です。
- 生む数に上限:激しい場面では粒子が爆発的に増えます。オブジェクトプールのようにリング状の配列を使い、古い粒子から上書きします。
つまずきやすい点
- 生む場所が波とずれる:粒子は波頭で生まれるべきなので、水面と同じ式(または同じテクスチャ)で尖り具合を調べます。描画用の水面と別の式を使うと、何もない所から泡が出ます。
- 泡が水面から浮いたり沈んだりする:泡の高さは毎フレーム水面に合わせ直します。水面の高さをずらした位置で調べると、波の斜面で泡がめり込みます。
- 白くなりすぎる:全部を白い粒子で描くと、海がざらついたノイズのように見えます。数を抑え、泡は水面の色に溶け込むよう薄くします。
デモで試すこと
- 「粒子の色」を「種類で色分け」にすると、白が飛沫、青が泡、紫が気泡です。波頭から白い飛沫が飛び出し、着水すると青い泡になって波に運ばれる様子を見てください。
- 「波の尖り(風の強さ)」を下げると、波頭が崩れにくくなり、白い水がほとんど生まれなくなります。上げると一気に増えます。
- 「崩れたと見なす尖り」を上げると、少しの尖りでも粒子を生むようになり、下げると本当に崩れる寸前の波頭だけから生まれます。
- 「すべて白(見た目)」にすると、実際のゲームでの見え方になります。「水面を表示」をオフにすると、水中の気泡が浮かび上がる様子も見えます。