Gerstner波による海面シミュレーション

マウスでカメラを回転、ホイールでズーム

太陽コントロール

27°
自動時刻変化

Gerstner波を使った海面描画のコードを作成します。Three.jsを使って実装します。Gerstner波を使った海面シミュレーションのコードを作成しました。このコードの特徴は以下の通りです: ## 実装されている機能 **Gerstner波の物理的挙動** - 各頂点が円運動することで、波の頂点が尖り、谷が丸くなる現実的な波形を再現 - 複数の波(5つ)を重ね合わせて複雑な海面を表現 **リアルな視覚効果** - フレネル反射による透明感 - 拡散反射と鏡面反射による光の表現 - 波の頂点付近での泡の表現 **インタラクティブな操作** - マウスドラッグでカメラの回転 - マウスホイールでズーム ## Gerstner波の数学的実装 各波は以下のパラメータで定義されています: - **振幅**:波の高さ - **波長**:波の長さ - **速度**:波の進行速度 - **方向**:波の進行方向 頂点シェーダーで、各頂点の位置を波の方程式に基づいて計算し、複数の波を重ね合わせることで自然な海面を作り出しています。 マウス操作でカメラを動かして、様々な角度から海面の波の動きを観察できます。波の頂点が尖っているのがGerstner波の特徴です。

太陽の位置に基づく空の色変化と太陽光反射を追加します。時間の経過とともに青空から夕焼けに変化するようにします。太陽と空の色変化、太陽光反射を実装しました。主な機能: ## 太陽の動きと時間システム - **60秒で1日のサイクル**:太陽が東から西へ移動 - **リアルタイム計算**:太陽の高度に基づいて色と光の強度が変化 ## 空の色変化 - **昼間**:青空(太陽高度 > 30度) - **夕方/朝方**:オレンジ・赤系の夕焼け色(太陽高度 -10〜30度) - **夜間**:深い青色(太陽高度 < -10度) ## 海面への影響 - **水の色変化**:時間帯に応じて海水の色が変化 - **太陽光反射**:水面に太陽の光が反射してキラキラ光る効果 - **空の反射**:水面が空の色を反射 - **フレネル効果**:視線角度による反射率の変化 ## リアルな光学効果 - **太陽のハロー**:太陽周辺の明るい領域 - **鏡面反射**:太陽光の水面反射 - **拡散反射**:全体的な明るさ - **空の色の反射**:水面が空の色を映し込む 時間の経過とともに青空から美しい夕焼けへ、そして夜へと変化する様子を楽しめます。水面には太陽の光が反射してリアルな海の表現になっています。

太陽高度の最小値を-5度に制限し、太陽の視覚的な描画を追加します。太陽高度の制限と太陽の視覚的表現を追加しました。主な変更点: ## 太陽高度の制限 - **最小値を-5度に設定**:完全な夜にはならず、常に薄明の状態を保持 - **自動時刻変化も-5度〜90度の範囲**で動作 - **色の計算も調整**:-5度でも夕焼け色を維持 ## 太陽の視覚的描画 - **太陽本体**:黄色の球体(半径8) - **ハロー効果**:太陽周辺のオレンジ色の光の輪(半径12、半透明) - **動的な色変化**:太陽高度に応じて色と透明度が変化 - **位置の同期**:計算された太陽位置に正確に配置 ## 視覚効果の改善 - **太陽の透明度**:高度が低いときは薄く、高いときは濃く表示 - **ハローの色調整**:太陽の色に合わせて変化 - **リアルタイム更新**:スライダー操作や自動変化に即座に反応 これで空に実際の太陽が表示され、太陽高度の変化に応じて太陽の見た目も変化します。海面への太陽光反射と太陽の位置が一致して、よりリアルな表現になっています。

スライダー操作中の視点変更を無効化し、太陽の位置と大きさを調整します。主な修正点: ## スライダー操作中の視点固定 - **`isSliderActive`フラグ**:スライダー操作中を検出 - **マウスイベントの制御**:スライダー操作中はカメラの回転・ズームを無効化 - **mousedown/mouseupイベント**:スライダーの操作開始/終了を検出 ## 太陽の視認性向上 - **太陽の距離を500に拡大**:遠くに配置してシーン全体に対する相対的な大きさを調整 - **太陽のサイズを20に拡大**:より見やすくなるよう大きく - **ハローサイズを35に拡大**:太陽周辺の光る効果を強化 - **透明度の調整**:高度に応じてより明確に見えるよう調整 ## シェーダーの調整 - **sunPosition.y / 500.0**:新しい太陽距離に合わせてシェーダー内の計算を調整 これでスライダーを操作しても視点が動かず、太陽も空にはっきりと見えるようになります。太陽高度を変更すると太陽の位置が空を移動し、それに応じて海面の色や反射も変化します。

自動時刻変化をデフォルトOFFにし、太陽高度30度で太陽が見えるようにカメラ位置を調整します。主な変更点: ## 自動時刻変化のデフォルト設定 - **チェックボックスの`checked`属性を削除**:デフォルトでOFF - **`autoTimeEnabled = false`**:JavaScript変数もfalseに設定 ## 太陽高度と表示の調整 - **初期値を30度に設定**:スライダーとJavaScript変数の両方 - **カメラ位置を(0, 8, 20)に調整**:太陽高度30度で太陽が画面上部に見える角度 - **初期距離を22に短縮**:より適切な視野角で太陽が見やすく - **カメラ回転時のY軸オフセットを8に変更**:一貫した視点の高さ これで起動時は太陽高度30度で太陽が画面上部に見え、自動時刻変化はOFFになっています。チェックボックスをONにすると自動で太陽が動き、OFFの時はスライダーで手動調整できます。

カメラの方位角を調整して、太陽と反対方向を向くように設定します。主な変更点: ## 太陽の位置を明確に定義 - **方位角180度(南方向)に太陽を配置**:`azimuthRad = Math.PI` - **数学的に正確な球面座標系**:高度角と方位角から3D座標を計算 - **太陽は常に南の空に位置**:時間や高度に関係なく方位は固定 ## カメラの初期方向を調整 - **方位角0度(北向き)**:`cameraRotationY = 0`で太陽と真反対を向く - **仰角を-0.3ラジアン(約-17度)**:`cameraRotationX = -0.3`で上向きに調整 - **視線方向**:北の空を見上げる角度 ## 座標系の整理 - **太陽**:南(Z軸負方向)の空 - **カメラ**:北(Z軸正方向)を向いて、太陽の方向を見る - **180度の関係**:太陽とカメラの方向が正確に反対 これで初期状態でカメラが北向きに設定され、南の空にある太陽(高度30度)がちょうど見えるようになります。太陽の方向とカメラの方向が正確に180度反対になっています。

太陽の方向を200度(南南西)に変更し、カメラ方向も対応して調整します。主な変更点: ## 太陽の位置調整 - **方位角を200度に変更**:南南西の方向(180度から20度ずらし) - **波の方向との角度を最適化**:Gerstner波の進行方向と太陽方向が斜めになり、より自然な光の反射 ## カメラ方向の対応調整 - **方位角を20度に設定**:北北東の方向(太陽の200度と180度対向) - **太陽との関係**:200度 - 20度 = 180度で正確に反対方向 - **視野角の改善**:波の方向と太陽光の関係がより美しく見える角度 ## 光学効果の改善 - **太陽光の海面反射**:斜めからの光により、より動的で美しいキラキラ効果 - **波の立体感**:太陽方向と波の進行方向が斜めになることで、波の凹凸がより立体的に見える - **自然な照明**:実際の海での太陽と波の関係に近い角度設定 これで太陽が南南西の空に見え、カメラは北北東方向を向いて太陽を見上げる構図になります。波の方向と太陽の角度が適切にずれて、より自然で美しい海面表現になります。