0:53Realistic ocean simulation in Godot
Realistic ocean simulation in Godot — Vidéo de @KanaWorks_AI avec Opus 5.5. Regardez la vidéo et lisez la publication originale pour comprendre son contexte.
0:55 · 701 mentions J’aime dans les données sources · 38.6K vues dans les données sources
Publication du créateur
Les publications et les titres originaux sont conservés dans leur langue d’origine.
Godotで「リアルな海」どこまで作り込めるか、
ひたすら試しています🐰
━━━━━━━━━━
同じような海を作ってみたい方へ
━━━━━━━━━━
このポストをまるごと自分のAIエージェント(Claude Codeなど)に貼って、
「これをGodot(または普段使っているエンジン)で再現して」
と頼んでみてください。
下の技術メモは、人よりもエージェントに読ませる前提で書いています。
━━━━━━━━━━
技術メモ(再現用)
━━━━━━━━━━
【1. 波:FFTオーシャン】
・コンピュートシェーダでFFTを計算。風浪はJONSWAPスペクトル、うねりは別のスペクトルで足し合わせ
・帯域分割したカスケードを5枚(各512²)。タイルサイズは2003/433/97/23.3/5.3 m
→ 遠くの大きなうねりから手前のさざ波まで、タイリングが目立たない
・振幅はあえて物理値より大きめ(有義波高がJONSWAPの約2.8倍)。物理的に正しく直した版も作ったものの、迫力が落ちたので戻しました
・法線とスロープモーメントのテクスチャは毎フレーム全ミップを生成し、LEADRで遠景の粗さを扱う(遠くの海面がギラつかない)
・波高はGPU→CPUの非同期リードバックで取得し、船の浮力計算(27点)に利用
・ベースはGodotOceanWaves(MIT)
【2. 水面のシェーディング】
・フレネルはSchlick近似(F0=0.02)
・空の映り込みはHDRI/プロシージャル空を直接サンプリングしてシャープに。そこに平面反射をブレンド
・水の色は吸収と後方散乱の係数(IOP)から算出。色を直接指定しない
・雲の影を海面に落とす
【3. 泡(いちばん効くところ)】
・白波:ヤコビアンが小さくなる(波面が折れ重なる)箇所から発生
・泡の持続シミュレーション(Crest方式)
2段のクリップマップで、毎フレーム前フレームの状態を同じワールド座標で再サンプリング。テクスチャは船に追従しても、泡はその場に残る
そのうえで流れ・チャンネルごとの減衰・航跡RTからのスタンプを適用
出力はRGBA16F(泡の量/鮮度/気泡/スリック)
・泡のディテールには、パブリックドメインの米海軍写真から作ったタイリングテクスチャを使用
【4. 航跡】
・真上から描くレンダーターゲットを近景420 m・遠景3.2 kmの2段×2系統
A:高さ・撹拌 B:レース状の泡・凪いだ帯・気泡
・ケルビン波(約19.5°のV字)はリボンメッシュで解析的に描画
・艦首波・艦尾波・艦首の水の盛り上がりはそれぞれ別パーツ
【5. しぶき】
・GPUパーティクル。散乱は2ローブのHenyey-Greenstein。粒の大きさに応じた空気抵抗で風下へ流れる
・艦首が波に叩きつけられる瞬間(スラミング)を、艦首と海面の相対的な上下速度から検出してしぶきを出す
・画面上で1.5px未満になる粒はサイズを据え置き、そのぶんアルファを下げる(エネルギー保存)→ 遠景でチラつかない
【6. 空とライティング】
・HDRIから太陽の方向と強さを実測し、ディレクショナルライトを合わせる
・夕景などはボリュメトリッククラウド(clayjohn氏のcloud_sky、MIT)
・環境キューブマップの下半球に「海」を描き込む(空の鏡像+暗い水)→ 船体への映り込みが自然に
【7. 船】
・駆逐艦「菊月」の3Dモデル(CC BY 4.0)
・塗装の値は実艦の写真から校正。プロシージャルな汚し、喫水線まわりの濡れ、頂点AOのベイク
・手すりや索具には専用の細線シェーダ(最低1.5px幅を保証)
━━━━━━━━━━
ハマりどころ(エージェント向け)
━━━━━━━━━━
・FFTの各ステージは別々のcompute listで実行すること。1つにまとめると競合してNaNが出る
・Godotでは.glslを編集したら再インポートが必要。未宣言の変数があってもエラーなしでパスが無効化されることがあるので、デバッグ表示で必ず確認
・空シェーダで1点でもNaNが出る(例:天頂ちょうど)と環境キューブマップ全体が汚染され、環境光で照らされるものがすべて暗くなる
・半透明エフェクトが読むスクリーンテクスチャは「他の半透明を描く前」のコピー。濃いしぶきで屈折させると奥の砲塔が二重に写る → 屈折させずに光を足す
・パーティクルの乱数をINSTANCE_IDから作らない(ソートで毎フレーム変わる)。シードはprocess shader側で保持する
・海面シェーダはvaryingの上限ぎりぎり。1つ増やしただけで海ごと消えることがある
━━━━━━━━━━
作り方のコツ
━━━━━━━━━━
・目分量で調整せず、数値で校正する。太陽はHDRIを実測、泡の被覆率はMonahanの式。根拠の数値はコメントに残す
・リファレンス用の実写写真(PD/CC0)を36枚集め、見た目で迷ったら写真を測って決める
・不具合は要素を1つずつオフにして原因を切り分ける。勘でパラメータをいじらない
・毎ラウンド同じカメラ位置で撮り直し、独立したレビュー役のエージェントが実写と見比べて8項目を10点満点で採点。このループを回しています(合格ラインはまだ先)
3Dモデル:DD KIKUZUKI/ASSOC.(CC BY 4.0)
FFTオーシャンのベース:GodotOceanWaves(MIT)
ボリュメトリッククラウド:cloud_sky by clayjohn(MIT)
Claude Opus 5.5 × @godotengine
Il s’agit du texte du créateur, pas d’un prompt de génération vérifié.




