On this page |
概要 ¶
Ripple Solver SOPは、浅い水面上に伝搬する波紋の作成に役立ちます。 例えば、雨滴によって引き起こされる波紋、水中を移動するボードによって発生する船首波です。 他にも、これを使用して、生地や皮膚に漫画のような効果、ポンプ/呼吸の効果、有機的な動きを生成することもできます。 このソルバは、平坦なジオメトリで非常に上手く動作しますが、3Dオブジェクトに対しても非常に信頼できます。
波紋の作成には、一般的に2つの手法があります。 とはいえ、両方の手法を組み合わせることも可能です。
-
1つ目の手法は、オブジェクトの元の静止状態( 1番目 のノード入力)と変形された状態( 2番目 のノード入力)との差分を使用します。 この手法をする場合、オブジェクトのトポロジーは変化してはいけません。つまり、ポイント、頂点、フェースの数は、 そのオブジェクトの静止状態と変形状態で同一 でなければなりません。
-
波紋を作成する2つ目の手法は、このソルバの 3番目 の入力に1つ以上のコリジョンオブジェクトを接続することです。 そのコリジョンオブジェクトの位置によって波紋の発生点が決まります。 コリジョンオブジェクトは、静止ジオメトリに対して痕跡を残します。 また、コリジョンオブジェクトのスケールは、波紋の中心のサイズを制御します。 コリジョンオブジェクトには、静的、移動、変形のどちらのオブジェクトでも指定可能です。
このノードの 1番目 の入力は必須です。 2番目 の入力が空っぽの場合、静止状態と変形状態は同一であるため、このソルバは、その 1番目 の入力のオブジェクトの使用を試みます。 この場合、警告が出されます。
Note
現在のところ、コリジョンオブジェクトは波紋のみを生成し、その波が表面を反射して複雑なパターンを形成することはありません。
このRipple Solverは、Shallow Water Solver SOPに似ています。 しかし、そのShallow Water SolverはHeight Fieldをベースにしているのに対して、 このRipple Solverはジオメトリを使用する手法を採用しています。 Ripple Solverを使用する場合、コリジョンオブジェクトは痕跡だけを残すことを知っていることが重要です。 例えば、水面下を移動する潜水艦から膨らんだ水面を作成することはできません。
Wave Type から2つのオプション( Normal と Vector )を選択することができます。
Normal を選択した場合、ポイントはオブジェクトの法線方向にしか変位しません。
さらに、このソルバのdisplacement
Pointアトリビュートのタイプはスカラーとなり、静止位置からのポイントの現在の距離が格納されます。
Vector を選択した場合、そのような制約がなくなり、displacement
Pointアトリビュートのタイプはベクトルとなり、静止位置からポイントの現在の位置までのベクトルが格納されます。
displacement
アトリビュートの値を確認するには、このソルバの Output タブを開いて、 Displacement を有効にします。すると、Geometry Spreadsheetでその値を見つけることができます。
例: 基本的な波紋 ¶
以下の例では、Torus SOP上を移動する波紋の作り方を説明しています。 Ripple Solverは、オブジェクトの静止状態と変形状態との差分から波紋を作成します。 これらの状態の間の距離で波紋の高さが決まります。
オブジェクト ¶
滑らかな波サーフェスを取得するには、オブジェクトにある程度のディテールが必要です。 つまり、ポイント/ポリゴンが多いほど、波は滑らかになります。
-
obj レベルで、Torusオブジェクトを配置して、それをダブルクリックして中に入ります。
-
Torus SOPを選択して、十分な解像度になるように Rows を
60
、 Columns を120
に設定します。
ポイントグループ ¶
この工程では、ポイント選択を作成し、そのポイントを変位させて波紋の発生点を決めます。 始める前に、マウスカーソルをビューポート上に移動させてSpace + 3を押して Front モードに切り替えます。 Wを押してシェーディングモードを有効にするのも良いでしょう。 こうすることで、ポイントが選択しやすくなります。
-
Group SOPを追加し、その1番目の入力をTorus SOPの出力に接続します。
-
Group Name パラメータに
wave_origin
(他の名前でも結構)と入力します。 -
Group Type を Points に変更し、 Base Group パラメータの隣にあるアイコンをクリックします。
-
選択したいポイントを⇧ Shiftクリック、または、マウスで矩形ドラッグします。
Note
選択ツールは、背面側の隠れているポイントも選択してしまいます。 それらのポイントを選択解除したいのであれば、再びマウスカーソルをビューポート上に移動させてSpace + 1を押して Perspective モードに切り替えます。 ポイントを選択解除するには、そのポイントを⌃ Ctrlクリック、または、⌃ Ctrl矩形ドラッグします。
-
選択が終われば、Enterを押してその選択を確定します。すると、そのポイントインデックスが Base Group パラメータに入ります。
下図では、十字型の選択パターンにしました。
変位 ¶
-
Soft Peak SOPを追加し、その入力をGroup SOPの出力に接続します。
-
Group パラメータに
wave_origin
と入力して、このノードの効果を上記で選択したポイントに制限します。 -
Distance を
0.15
に設定して、選択したポイントを変位させます。変形を加えないと後で波紋を再生しても何も起きなくなるので、これは重要です。 -
滑らかなサーフェスを取得するために Translate Along Lead Normals を無効にします。
-
Soft Radius パラメータは、ポイント選択を基点にポリゴンを滑らかに変位させます。ハードエッジにするには、この値を下げます。
これで、元の静止状態とポイント変位による変形状態が出来ました。
波紋 ¶
Ripple Solverは、静止状態と変形状態との差分を計算して波紋を生成します。
-
Ripple Solver SOPを追加し、その 1番目 の入力( Rest Geometry )をTorus SOPの出力に接続します。
-
そのRipple Solver SOPの 2番目 の入力( Displaced Geometry )をSoft Peak SOPの出力に接続します。
-
プレイバー上の Play Forward アイコンをクリックして、最初のシミュレーションを開始します。
以下の動画は、Ripple Solverのデフォルト設定で得られた結果です。
displacement
値を色で表現しています。
波紋の速度 ¶
Ripple Solverの Setup タブには、波紋の速度を制御するためのパラメータが2つ( Wave Speed と Rest Spring )あることが分かります。
Wave Speed は、波紋がポイントからポイントへ移動する速度を定義します。
Rest Spring は、変位されたポイントを静止位置の方へ引っ張り戻そうとする力です。
Wave Speed を0
、 Rest Spring を1
(またはそれ以上)に設定すると、ポンプ/呼吸の効果に似た上下の動きが生成されます。
Rest Spring 値を10
以上に上げると、上下運動のサイクルが速くなります。
Conservation は、波紋の速度に寄与しませんが、時間の経過と共に波紋を減衰させることができます。
1
の値は、波紋のエネルギー全体が保持され無限に動きます。
1
未満の値は、波紋がエネルギーを失います。
例えば、0.7
の値は、波紋が1秒後に初期エネルギーの30%を失います。
0.2
の値なら80%を失います。
サブステップ ¶
サブステップは、シミュレーションの精度を定義します。 Ripple Solverのサブステップは適応的です。 Ripple Solverは、シミュレーションを安定させるのに必要なサブステップ数を計算します。 その実際のサブステップ数は、 Min Substeps から Max Substeps の間に収まります。 安定性の問題が観測された時にあなたがまず最初にすべきことの1つは、このソルバの Min Substeps を上げることです。 ソルバが調整したサブステップ数よりもっと多くの最大サブステップ数が必要に なった場合、安定性を維持するために内部的に Wave Speed と Rest Spring がクランプ(制限)されます。
Wave Speed と Rest Spring がクランプされているかどうかを確認するには、
このソルバの Output タブに進んで、 Substep Clamped を有効にします。
そして、Geometry Spreadsheetを開いてシミュレーションします。
このsubstepclamped
Pointアトリビュートが1
ならば、 Wave Speed と Rest Spring はクランプされています。
厚み ¶
thickness
Pointアトリビュートは、各ポイントにおけるそのジオメトリの厚みを示したプラスの値です。
このアトリビュートは、各ポイントでの波紋の高さをクランプしたり、コリジョンによる歪みの量を決めるのに使用します。
このアトリビュートが存在しなかった場合、そのポイントの厚みは、 Thickness タブの設定で決定されます。
クランピング ¶
Clamping タブのパラメータは、 Thickness に関連しています。 クランピングは、 Thickness より大きなすべての変位値がカットオフされることを意味します。 値がカットオフされると、ハードエッジが生成されてしまいます。 滑らかでもっと有機的なルックに戻すには、 Soft Clamp Falloff を使用します。
-
クランプリングの効果を確認するために、 Enable Clamping をオフにし、 Soft Clamp Falloff を
0
に設定します。 -
さらに、 Thickness を
0.1
に設定します。Soft Peak SOPの Distance 値で決められた実際の変位値は0.1
です。ビューポートを見ると、オブジェクトが以前と同じように見えます。 では Enable Clamping をオンにしてください。その泡形状が変化したのが分かります。 -
滑らかなルックに戻すには、 Soft Clamp を
1
まで上げ、 Soft Clamp Falloff を2
まで上げます。
例: 雨滴 ¶
この例では、Ripple Solver SOPの 3番目 の入力を使用して雨滴を作成する方法を説明しています。 この考え方は、平面上にいくつかの小さな球を散布することです。 それらの球が小さな波のシードとして作用します。 時間ベースのエクスプレッションとノイズアトリビュートによって、自然な分布が生成されます。
水と雨滴 ¶
このプロジェクトの水面は、十分なディテールが得られるように高解像度なグリッドを使用しています。 そして、そのグリッド上に様々なサイズの球をランダムに配置します。 それらの球がコライダーとして作用し、“衝撃”によって波が生成されます。
-
obj レベルで、Gridオブジェクトを配置し、それをダブルクリックして中に入ります。
-
Grid SOPを選択して、 Size パラメータ(幅と高さ)を
7.5,7.5
に設定します。 -
小さな波紋に対して十分な解像度が得られるように、 Rows と Columns を
500
まで上げます。 -
Sphere SOPを配置し、 Uniform Scale を
0.1
に下げます。このジオメトリを後でインスタンス化して雨滴を作成していきます。 -
Scatter SOPを配置し、その入力をGrid SOPの出力に接続します。
-
そのScatter SOPの Force Total Count を
7
に変更します。このパラメータでは、球インスタンスの数を指定します。 各フレームで新しい球が取りこまれて前の球が削除されるようにするために、 Global Seed を$F
に変更します。 このエクスプレッションは、時間の経過と共に球の分布を変えます。 しかし、フレーム毎の新しい球の数は一定のままです。
そのScatter SOPの青い Display/Render フラグをオンにすると、ビューポートには7つの黒いドットが表示されているはずです。 タイムスライダーをドラッグして、ポイントの分布が時間の経過と共にどのように変わるのか確認します。
インスタンスからの波紋 ¶
インスタンスを作成するために、散布されたポント上に球をコピーします。 下図が、その完全なネットワークのプレビューです。
-
Copy to Points SOPを配置し、その 1番目 の入力をSphere SOPの出力に接続します。 その 2番目 の入力をScatter SOPの出力に接続します。
-
Ripple Solver SOPを配置します。その 1番目 と 2番目 の入力をGrid SOPの出力に接続します。 その 3番目 の入力をCopy to Points SOPの出力に接続します。
-
波紋を減衰させ、その波紋が時間の経過と共に消えるようにするために、 Setup タブの Conservation を
0.3
に変更します。 -
Play Forward ボタンをクリックして、シミュレーションを開始します。
球インスタンスが青いワイヤーフレームオブジェクトとして表示されています。 ソルバは、それらの球をコリジョンオブジェクトとして認識し、その周辺に波紋を生成します。 シーンをレンダリングする時、その青いインスタンスは考慮されません。 下図では、説明用に雨滴の数を増やしています。
マスク ¶
雨滴の分布の均一なルックを変えるために、動的なマスクを適用することができます。 このマスクは、特定の領域を除外し、雨滴が多いゾーンと少ないゾーンを作成します。
-
Attribute Noise SOPを追加し、それをGrid SOPとScatter SOPの間に配置して接続します。
-
Attribute Names パラメータの横にある Y ボタンと Z ボタンをオフにして、
Cd
アトリビュートのRコンポーネントのみを残します。 -
Range Values ドロップダウンメニューから Zero Centered を選択します。
-
Offset パラメータの値を再び
$F
に変更します。このエクスプレッションは、現行フレームを使用して時間軸でノイズパターンを変化させます。 -
Scatter SOPの Density Attribute チェックボックスをオンにし、
density
をCd
に書き換えます。ノイズパターンのRコンポーネントが雨滴を作成するかどうかを決めます。 -
インスタンスを生成した後にそのカラーを除去するために、Attribute Delete SOPを追加し、それをCopy to Points SOPとRipple Solver SOPの間に配置して接続します。
-
Point Attributes パラメータに
Cd
と入力します。 -
Play Forward ボタンを押してシミュレーションします。
下図は、カラーマスクのスクリーンショットです。
スケールのランダム化 ¶
もっとリアルにするために、雨滴のサイズをランダムにすることもできます。
-
Attribute Randomize SOPを追加し、それをAttribute Noise SOPとScatter SOPの間に配置して接続します。
-
Attribute Name パラメータの
Cd
をpscale
に書き換えます。 -
Distribution タブの Distribution ドロップダウンメニューから Two Values を選択します。これは、最小値と最大値の間でランダムな値が取得されます。
-
pscale
はスカラーなので、 Dimensions を1
に設定します。 -
Value A に
0.6
を入力します。 Value A/B パラメータの範囲内のランダム値が球の現行スケールに乗算されて、実際の値が取得されます。 -
再びシミュレーションします。
How to ¶
To... | Do this |
---|---|
波紋を減衰させていく |
デフォルトでは、波紋はエネルギーを失わず、事実上、永久に伝搬します。 波紋を減衰させていくには、ソルバの Setup タブを開いて、 Conservation を下げてください。
|
波紋の速度を変更する |
Wave Speed パラメータが Setup タブにあります。 Rest Spring パラメータが高いほど、上下運動のサイクル数が多くなります。 時間あたりのサイクル数が多いほど、波紋は速くなることを意味します。 |
不安定さを解消する |
サブステップ数を上げることが、不安定さを解消する一般的な方法です。 まずは、 Simulation タブの Min Substeps を上げてみてください。 それでも問題が解消しなければ、 Max Substeps も上げてみてください。 不安定さと混沌としたサーフェス構造を取り除くもう1つの方法は、波紋からエネルギーを除去することです。 Setup タブの Wave Speed を下げて、より低い Conservation 値で波紋をフェードアウトさせることができます。 |
品質を上げる |
CFL Condition パラメータを下げると、より高品質な結果が得られますが、計算が遅くなります。 デフォルトの1で良い結果が得られるので、これを変更する必要性はほとんどありません。 |
ジオメトリが折り重ならないようにする |
ポイントの変位がそのポイントの厚みを超えないように Enable Clamping をオンにします。 また、 Soft Clamp Falloff パラメータを使用することで、変位がポイントの厚みに近くなった時に遷移を滑らかにすることができます。 |
オブジェクトを波紋ソースとして使用する |
Ripple Solver SOPの 3番目 の入力は、オブジェクトを受け取り、その位置とサイズを使用して衝撃波紋を生成します。 完全なワークフローガイドは、雨滴の例を参照してください。 |