Ocean Spectrum [Mardini2024]

これはMardini2024のDay16 Ocean Spectrumの動画を視聴してまとめたものです。

[動画](https://www.youtube.com/watch?v=R-QzOTRUPng)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d69d33f3-186b-44a9-9906-eaeb23a0a0af.png)


[公式のサンプルファイル](https://media.sidefx.com/uploads/contests/mardini2024/moeen_videos/mardini_examples_day16_oceanspectrum.zip)

[Day15 Pyro Burst Source](https://qiita.com/jyouryuusui/items/822b27981e7a13d82317)　|　Day16 Ocean Spectrum |　[Day17 Flip Solver ](https://qiita.com/jyouryuusui/items/c1927d6815e3e25bc144)

Ocean Spectrumノードを使用すると、リアルな海洋の波のシミュレーションを作成できます。


[Ocean Spectrumのヘルプ](https://www.sidefx.com/ja/docs/houdini/nodes/sop/oceanspectrum.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f780304a-9250-a345-1049-454dbd36a224.png)


# 要約

- Ocean Spectrumノードは、海洋の波のスペクトラムデータを生成できます
- Ocean Evaluateノードを使用して、スペクトラムデータをジオメトリに適用します
- 解像度、グリッドサイズ、タイムスケールなどのパラメータを調整できます
- 風向、風速、うねり、チョップなどのパラメータで波の特性を制御できます
- Wave Instancingを使用して、タイリングを解消し、バリエーションを追加できます
- マスクを使用して、波の高さを抑制し、リアルな表現が可能です
- シェルフツールを使用して、簡単に海洋シミュレーションをセットアップできます
- Karma Render Settingsノードを使用して、ビューポートでオーシャンを表示できます
- Attribute VOPを使用して、Ocean Spectrumのデータを直接操作できます
- Ocean Spectrumのデータを使用して、他のシミュレーションを駆動することもできます

# サンプルファイル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/65859071-b0c6-a302-bffc-f324e186440a.png)

OCEAN_EVALUATE

Ocean Spectrumの評価例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/85655104-add2-54f8-0b13-69a76d289a48.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/fc9b1258-5a1b-11c6-3729-089be1350c52.png)


DISPLACE

CdにVelocityを反映させた例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c5d26e48-e12c-5ede-65e3-1e95584553d5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/e637a66e-2d30-589d-0532-b342d575be44.png)

ocean_surface　ocean_interior

シェルフで作成されるノード

Stage

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/d48bce59-5080-ed6a-555a-d6ab221db7bd.png)


## Ocean Spectrumノードの基本

Ocean SpectrumもSOPレベルのジオメトリノードです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/8eddc796-ae6a-3113-ffba-4b820e2ca5bd.png)


ビューポートにはガイドが表示されますが、特に何も見えません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/3b32d7e0-94b4-5f43-e374-e983f58f3a3f.png)


海の動きを見るためには、追加でOcean Evaluateノードを接続する必要があります。

### Ocean Spectrum + Ocean Evaluate 

Ocean Evaluateノードを追加し、Ocean Spectrumの出力から2番目の入力に接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/7723810c-b639-6fc4-e237-f8dbf732a323.png)


しかし接続してもまだビューポート上は何も見えません。なぜなら第1入力にジオメトリを入力するモードになっているからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/31423b98-8c88-1f4c-ef92-ca3fbc939781.png)

Preview Gridに切り替えるとOcean Spectrumが表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/9ed081ab-1c52-2a42-40e8-40a14d56a452.png)

デフォルトのDeform Input Geometryに戻し、Grid（Size:1000×1000,RowsColumns:500）を入力に入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/09821060-81db-1b3c-ab76-450119b3f97d.png)



oceanspectrumの Node Infoを確認すると、いくつかのAttributeやボリュームのデータが確認できます。このデータをOcean Evaluateノードが解釈し、ジオメトリに適用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/192eb1ed-1095-75f5-5f96-cff4bfa63e12.png)

### Ocean Spectrumの問題点

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/26b63e94-4e7a-ef83-b19c-216a3c04193b.png)

先ほど作成したGrid入力の結果は明らかに問題があります。全体的にタイル化されており、本物の海にはまったく見えません。再生させると、Ocean Spectrumによって海の動きが付いていることを確認できます。

### Ocean Spectrumの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c773c460-2870-ef10-4291-d460aa910d5c.png)

- Resolution Exponent : Ocean Spectrumの全体解像度
    - 値が高いほど解像度が高くなります。つまり、周波数が小さくなります
    - 値が低いほど、ディティールがなくなります
    - 値を2にすると、非常に大きな動きだけが維持されます
    - 一般的には、7から9の間の値が推奨されます
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/7140f695-5a8d-b067-c658-401a5ac048df.png)

- Grid Size : 特定のグリッドブロックのサイズです
    - 値を20に変更すると、小さな海を想定していることがわかります
    - 一般的には、50の値で大丈夫です
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c35b78b8-845e-af81-8556-2efbc9eb8a10.png)


- Time Scale : 海の再生速度
    - 値を上げると海の再生速度が上がります。しかし、これは物理的に正確ではありません
    - 速く移動している時の海という意味ではなく、ただ2倍の速度で再生しているだけです。なので、少し奇妙に見えることがあります。しかし、時々、Time Scaleを調整して、実際に海の速度を調整したい場合があるでしょう
- Windタブ : 風
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/e1671c83-c630-00b7-7a82-5efebe198a06.png)
    - Spectrum Type
        - TMA(Texel-Marsen-Arsloe)スペクトル
            - 風がオーシャンに作用した時間の長さを指定するパラメータが追加され、 Depth設定を低くするとパフォーマンスが向上するように拡張されたスペクトル
    - Direction：波が動く方向
        - デフォルトのDirectionが0の状態ではX軸の正の方向に動いています
        - 値を変更すると、Y軸で回転します。つまり、90度で正のZ、180度で負のX、270度で負のZ、そして360度で正のXに戻ります
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/e8e44826-2a96-1ad7-6e4b-2baae02d9d1d.png)

    - Wind Speed：海のダイナミックレンジを増加させます
        - これが意味するのは、風速によって生じる波の高さです
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/9ace2e70-8a67-da3a-cf80-b527348fc3e8.png)


    - Swell（うねり）
        - Directionと連動して動作する値
        - 値によってTMAスペクトルの波の指向性が強くなります
        - 1に上げると、すべての波はDirectionで設定した方向にのみ動き、-1に設定すると指向性がなくなり、風と反対の方向を向く波が追加されます
    - Fetch（km）
        - 海岸からどれだけ離れているか
        - 一般的に海の場合は300のようなものを使用しますが、より浅い水域が良い場合は、10km以下に下げることがあります
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/44c4840e-cee1-8a8e-74af-c5dadac8c701.png)

    - Chop
        - 波のピークがどれだけ鋭いか
        - 値を上げると密集して引き寄せられ波が尖ります、値を下げると広がりなめらかになります
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/50ecd481-5f6b-c8ea-8d5d-68b164a8402e.png)
- Amplitudeタブ
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a8d6b067-8c86-081d-a079-2eea503175a5.png)
    - 海のスケーリング係数
    - 値を上げると乗数としてスケールされ、誇張された波になります
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/30d8f72d-ac1c-51b1-5ca2-8743e9a562da.png)

### Wave Instanceによるタイリングの除去

Wave Instanceはタイリングを取り除くのに役立ちます。除去を効果的に行うためにScatterノードを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/877b183f-ea9c-b66c-7cf7-b213b0b63143.png)

ジオメトリ（ここではGrid）上で均等にポイントを分布させます。そのままだと均等ではないので、Max Relax Radiusを増やしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5e636c2b-ccbf-1c74-45e9-1d8a5a86573c.png)

接続した結果を見てみましょう。小さなパッチができているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c87c40f7-9810-5b4c-15ed-eaecb970ac08.png)


例えば、Scatterのポイント数を50に減らすと「小さなパッチ」が何なのかがわかります。
すべてのポイントに波のパッチがインスタンス化されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/740950aa-47fe-a722-e04e-20eec639e58a.png)


Wave Instancingタブではバリエーションの設定ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/9ae76706-39b5-646a-c5c4-8cc7dcdb8919.png)

Scatterで分布させた全ポイントは、20の半径、Zの回転、0.8の振幅を持ち、それぞれのバリエーションを持ちます。ポイントの数を2倍の2000にすると、より海面らしい形にすることができます。

Scatter時に、分布できていないポイントがある場合、ScatterノードのScale Radii byを1から10に増やしてください。より均一に分布した状態にすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/85a4b668-a49d-2ac9-f3b1-d5b1aba92f18.png)

これでOcean Spectrumからタイリング取り除かれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/03d93b1e-a7ee-0092-a4f6-27f0600aca3f.png)

■ 注意点

このScatterポイントは加算的であることに注意してください。例えばポイント数を8000など増やしすぎると、海に小さなアーティファクトやものが発生してしまい、ピークが本当に高くなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/ea6e155d-8136-07fd-fd31-f731cb8f51c2.png)

なぜなら、たくさんのポイントを互いの上に重ねて、振幅を単に足し合わせているからです。あまりにも多くのポイントを互いに近づけすぎないようにしてください。



## マスクの使用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/645567f6-1132-a021-c119-9ad284414a2c.png)


マスクタブの中を見ていきます。Suppressionを使用してAdd Noiseにチェックを入れてノイズを追加すると、Ocean Spectrumの一部の領域が平坦になるのがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/0e17b274-72c1-5e25-67ee-7696cabba7b1.png)

これで波打っているところと、波打っていない場所ができてリアルになります。とはいえ一切波が無く平坦になるのも変なので、いくつかの変更を加える必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/97cd250c-a905-861f-096c-26562d671c6c.png)

Output Rangeの入力範囲と出力範囲で、0の値を0.3に変更します。ノイズの領域がゼロの値を取得しないようにするためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/9b4c1587-d613-930e-75c4-be729e3d926a.png)



## Ocean Spectrumの使用方法

Ocean Spectrumの活用事例を知るために、シェルフのOceansタブからいくつかの例を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f501912e-13b8-df46-bf6c-5a2a131939bb.png)

Small Oceanをクリックすると、小さな海が生成されます。
先ほどやった例と同じことが行われていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/66c90cfd-bdf7-e779-c0d8-6ccc39743736.png)

このネットワークを見ると、Ocean SpectrumがOcean Evaluateに適用され、ここにノード名はプレビューとあります。ROP Geometry OutputはOcean Spectrumから伸びており、つまり実際に出力されている海の情報はOcean Spectrumが全て持っています。ディスクに保存するときは、単にbgeo.oscファイルとしてのみ保存します。

Stageを見ると、Houdini Ocean Proceduralノードが追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/456c7fde-7c22-92fc-e53d-e180a91a61e5.png)

レンダリングのためにディスクからスペクトラを取得しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/129d39fa-7740-f607-b506-f22ac07bb52d.png)


よってまずはFile Cacheで「Save to Disk」を押して、ディスクに保存してからレンダリングを行う必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/b89d7a9f-8068-cd99-ad54-2e944ece9851.png)


## Karmaでの海のプレビュー
ただし、Karmaで海をプレビューするには、実際にはいくつかの設定が必要です。デスクトップをSolarisにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/db184789-ba56-429f-a7ad-c6579b88d5ef.png)

カメラ、ライト（Sky）、Karma Render Settingsノード、USD Render ROPノード追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/2cb88c5a-6f97-a3d7-fd50-efe856bc4419.png)

ビューポートをKarmaに切り替えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/60f14976-9aba-9014-9e0e-1423e12e5f57.png)

いまのところ平らな平面があるだけです。
海を表示するためには、Preview Houdini Proceduralsノードが必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/3cb1d636-7f94-63e7-9463-68ea3ce81068.png)

すると非常に低解像度の海が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/591a9260-c1f0-a127-5a61-3df5457fe89d.png)


より高解像度のものを見るには、Ocean Proceduralに移動し、Viewport Qualityを0.1から1に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/debd3184-2c55-467e-99bc-d69a07bfccc8.png)


これで海がレンダリングされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/7e232e4a-b600-2472-da94-60ab884a4926.png)


## 他のOcean Tools

Small Ocean以外にLarge OceanとGuided Ocean Layerがあります。

### Large Ocean

Large OceanはSmall Oceanとほとんど同じ拡張バージョンです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/3bffe5b6-5e21-a5c5-63c6-7e49847c0bc3.png)

スキャッタースプリットの下を見るとOceanSpectrumを２つ作成して、一緒にマージしてから、Ocean Evaluateに渡しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/58e459b4-75a5-e07b-ca45-683e9ad9d08f.png)


### Guided Ocean Layer

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/c5d5cefa-b00e-d915-3657-60dace0a9397.png)


これはかなり複雑です。なぜなら、Flip SolverとOcean Spectrumを使用するからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a02af9f4-1971-fecd-2412-d34e259efb01.png)

Ocean Spectrumを作成し、Wave Tankに供給され、Guided Ocean Layerに渡されるのがわかります。それが海のシミュレーションに使用されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/94c2f10c-c4a8-1ba2-6344-5f404e38fc21.png)

## Ocean Evaluateとその他の方法

Ocean Spectrumからのディスプレイスメント情報はグリッド以外にも適用できます。たとえばラバートイ（Unifrom Sizeを10などに増やし、サブディバイドしたもの）でも大丈夫です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/e97bbfb8-388d-234b-5e87-d90a2d21e888.png)

Ocean Spectrumの影響を受けることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/84f7b292-abc8-0b4a-d3a0-a0dcb0fa477f.png)

Ocean Evaluateを使用せずに変形させる方法もあります。それはAttribute VOPを使用する方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/f17aa76a-ca22-f743-f45e-c7b0d7a3fe42.png)


1番目の入力はジオメトリからスキャッターされたポイントが入力されています。
Ocean Spectrumは2番目の入力に接続します。

VOP内部では、Ocean Sample Layersを使用できます。必要なのは、ジオメトリのP（位置）、Time（時間）、そしてファイル名が2番目の入力のOcean Spectrumです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/5abe53f1-0196-84ef-dc5f-6eeed2d3c3ef.png)

ディスプレイスメントについては、元の位置に変位出力をAdd（追加）して出力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/de758e41-9f3f-3612-1f74-b5bda6b86c57.png)

さらに、Cusp（鋭さ）のようなものを出力することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/8397c64a-c997-1fc9-93a4-d5adb97402ad.png)



例えばCdに出力すると、これがスペクトルのピークが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/84f288c3-ce28-126f-5ec9-894aa6ac9a4b.png)


同様に、Velocity速度もCdに入れて確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/90ce2e3c-bf09-8230-4c87-0d6a3ee1fb89.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151589/a5a1d3bc-7e1a-157d-f941-95268ccc6c2e.png)




## まとめ

Ocean Spectrumノードはリアルな海洋シミュレーションを作成できます。Ocean Spectrumからは多くのデータにアクセスできるので、データがどこに存在しているのか、関連してどのように操作するかを知っていれば様々な表現に結びつけることができます。パラメータを調整し、他のノードと組み合わせることで様々な表現が可能です。