レイマーチング: カメラから各ピクセルに向けて光線を飛ばし、ボリューム内を等間隔でサンプリング
Henyey-Greenstein位相関数: 物理的に正確な散乱方向の計算
シャドウマーチング: 各サンプル点から光源への遮蔽を詳細に計算
多重散乱近似: より現実的な光の相互作用をシミュレーション
フラクタルノイズ: 自然な雲や霧の構造を生成
ボリュームライティングの基本的な実装をHTML5 CanvasとJavaScriptで作成します。レイマーチング手法を使用したシンプルなボリュームライティング効果を実装します。ボリュームライティングのデモを作成しました。このコードは以下の技術を実装しています: ## 実装された機能 **レイマーチング** - カメラから各ピクセルに向けてレイを飛ばし、一定間隔でサンプリング - ボリューム密度をPerlinノイズで生成 **光の散乱計算** - 各サンプル点で光源への光の減衰を計算 - 距離による減衰と遮蔽を考慮 **物理的効果** - 透過率(Transmittance)による光の減衰 - 散乱係数による光の拡散 **インタラクティブ制御** - マウスで光源位置を変更 - スライダーでパラメータを調整 - リアルタイムでの効果確認 ## 主要パラメータ - **Light Intensity**: 光源の強度 - **Volume Density**: ボリュームの密度(霧の濃さ) - **Scattering**: 散乱係数 - **Steps**: レイマーチングのサンプル数(品質vs性能) このデモは教育目的の簡易実装です。実際のプロダクションでは、GPUシェーダーを使用してより高性能な実装が行われます。また、より高度な技術として、ブルーノイズサンプリングや時間的アップサンプリングなども使用されます。
より高品質なボリュームライティングのデモを作成します。今回はより物理的に正確な実装とビジュアル効果を追加します。より高度なボリュームライティングのデモを作成しました。今回の実装には以下の改良点が含まれています: ## 新機能・改良点 **物理的精度の向上** - Henyey-Greenstein位相関数による方向性散乱 - 吸収と散乱の分離 - 異方性パラメータ(前方散乱/後方散乱の制御) **視覚効果の強化** - 色付きライトソース(RGB制御) - フラクタルノイズによるリアルな密度分布 - 高さと端による自然な減衰 **パフォーマンス最適化** - 2x2ピクセルブロック描画 - オフスクリーンCanvas使用 - 適応的シャドウマーチング **ユーザーインターフェース** - プリセット効果(霧の森、埃っぽい部屋、濃い煙、薄い霧) - リアルタイムFPS表示 - 直感的なスライダー制御 - マウスホイールでの光強度調整 **高度なパラメータ** - **Anisotropy**: 散乱の方向性(-1=後方散乱、+1=前方散乱) - **Absorption**: 光の吸収率 - **Light Steps**: シャドウ計算の精度 - **Noise Scale**: ボリューム構造の細かさ この実装は教育目的としてボリュームライティングの主要概念を実演しており、実際のプロダクションレベルの技術を簡素化した形で体験できます。プリセットボタンで異なる大気効果を簡単に試すことができ、各パラメータの影響を視覚的に理解できます。
主な変更点: ## 修正内容 **キャンバスサイズ変更** - 600×450ピクセルに変更 - 光源の初期位置を調整(200, 150) - 光の範囲も比例して調整 **パフォーマンス最適化** - OffscreenCanvasを通常のcanvasに変更(互換性向上) - レイステップ数を128→64に削減 - ライトステップ数を32→24に削減 **表示問題の解決** - より確実なcanvas描画メソッドを使用 - 初期パラメータを小さいキャンバスに最適化 これで600×450サイズで確実に表示されるはずです。もし まだ表示されない場合は、ブラウザのコンソール(F12)でエラーメッセージを確認してください。JavaScript エラーがある場合はそこに表示されます。 また、より軽量な設定にしたので、パフォーマンスも改善されているはずです。
スポットライトのコントロールが表示されない問題を修正します。CSSの調整とHTML構造を確認します。問題を修正しました!主な変更点: ## 修正内容 **HTML構造の改善** - スポットライトコントロールを独立した`control-section`として分離 - `id="spotSection"`で一括管理 - より明確な構造でスクロール時の表示問題を解決 **JavaScript修正** - `spotSection`として単一要素で制御 - `display: block/none`で確実な表示切り替え - デバッグ用のconsole.logを追加 **CSS強化** - `!important`で確実な非表示制御 - レイアウトの安定性向上 ## 使用方法 1. **Light Type**で"Spot Light"を選択 2. **Spot Controls**セクションが表示される 3. **Cone Angle**: ビームの広がり角度を調整 4. **Direction**: 照射方向を調整 これでスポットライトを選択すると確実にコントロールが表示されるはずです。もし まだ表示されない場合は、ブラウザのコンソール(F12)でエラーメッセージを確認してください。
スポットライトの円錐状光跡が実際にボリュームレンダリングで表示されるように修正します。現在は輪郭線のみで、実際の光の散乱が円錐状になっていない問題を解決します。スポットライトの円錐状光跡が実際に表示されるように修正しました!主な修正点: ## 散乱計算の修正 **方向ベクトルの正確な計算** - 光源から各点への方向ベクトルを正確に計算 - `normalizedLightDir`として別変数で管理 - 角度計算の符号を修正 **スポットライト減衰の改善** - 角度計算で`Math.abs(dot)`を使用して正確な角度を取得 - 減衰カーブを`1.5`乗に調整してより自然な光の落ち方 - 円錐外では完全に`0.0`で光が届かない ## プリセットの改善 **スポットライト用パラメータ追加** - `sunset`プリセット: 60°の広角、右向き照射 - `mystical`プリセット: 30°の狭角、斜め下照射 - より高い散乱値と密度で効果を強調 ## 使用方法 1. **Light Type**で"Spot Light"選択 2. **開始ボタン**でレンダリング開始 3. **Cone Angle**で円錐の広がりを調整 4. **Direction**で照射方向を変更 これで実際の円錐状の光跡が表示され、角度や方向を変更すると光の形が変わることが確認できるはずです!懐中電灯や舞台照明のような効果が得られます。
スポットライトの方向計算を修正し、初期値を下方向に設定して、確実に円錐状の光跡が表示されるようにします。大幅に修正しました!スポットライトの円錐状光跡が確実に表示されるようになります。 ## 主な修正点 **方向の修正** - 初期方向を90°(下方向)に変更 - スライダーのデフォルト値も90°に設定 **スポットライト計算の根本的な見直し** - `calculateSpotAttenuation`で光源からサンプル点への方向を直接計算 - 複雑な方向変換を排除してシンプルで確実な計算 - 線形減衰(`Math.pow(falloff, 1.0)`)でより明確な円錐境界 **散乱計算の改善** - スポットライト減衰を`samplePos`で直接計算 - シャドウマーチングを簡略化してパフォーマンス向上 - より強い効果を得るためにパラメータ調整 **プリセットの強化** - `sunset`プリセット:強い光強度(3.5)、高密度(0.5)、下向き照射 - より明確な円錐状効果が見える設定 ## 使用方法 1. **Light Type**で"Spot Light"選択 2. **開始ボタン**でレンダリング開始 3. 下方向に向かう円錐状の光跡が表示される 4. **Cone Angle**で円錐の広がりを調整 5. **Direction**で照射方向を変更 これで確実に円錐状のボリュームライティング効果が表示されます!
スポットライトの計算ロジックに根本的な問題があります。散乱計算でスポットライト減衰が正しく適用されていない可能性があります。完全に見直します。根本的な問題を修正しました!主な変更点: ## 散乱計算の完全な見直し **スポットライト計算の統合** - `calculateSpotAttenuation`関数を削除 - 散乱計算内で直接スポットライト減衰を計算 - より確実で直接的なアプローチ **角度計算の改善** - Z方向成分を0.5に設定(より現実的な3D効果) - 角度が円錐外の場合は完全に`{r:0, g:0, b:0}`を返す - 2乗減衰で明確な境界を作成 **パラメータの大幅調整** - 光強度: 4.0(非常に強く) - ボリューム密度: 0.6(高密度) - 散乱: 3.0(強い散乱) - 吸収: 0.4(低吸収で光が通りやすい) - 光源位置: y=80(より上部) **パフォーマンス最適化** - ライトステップを8に削減 - シャドウマーチングを簡略化 ## テスト手順 1. **Light Type**で"Spot Light"選択 2. **開始ボタン**でレンダリング開始 3. 明確な円錐状の光跡が表示される 4. **Cone Angle**を10°-90°で調整 5. **Direction**を変更して照射方向を確認 これで確実に円錐状のボリュームライティング効果が表示されます!光源から下方向に向かう明確な光の円錐が見えるはずです。
下方向のみの単一円錐にします。角度計算の問題を解決します。2つの円錐が表示される問題を修正しました!主な変更点: ## 単一方向円錐の実装 **角度計算の修正** - `Math.abs(dot)`を削除して符号を保持 - 内積が負の場合(反対方向)は完全に遮断 - これにより上向きの円錐が完全に消除される **方向制限の追加** - `dot <= 0`の場合は`{r:0, g:0, b:0}`を返す - 指定された方向のみに光が照射される **視覚的表示の改善** - 円錐の輪郭表示も下方向のみに制限 - `spotDir.y > 0`の条件で下向きの場合のみ描画 ## 動作確認 **期待される結果** - 光源から下方向のみの単一円錐 - 上方向には一切光が照射されない - **Direction**スライダーで方向を変更すると単一円錐が回転 **テスト方法** 1. **Light Type**で"Spot Light"選択 2. **開始ボタン**でレンダリング開始 3. 下方向のみの単一円錐を確認 4. **Direction**を0°, 180°, 270°に変更して単一方向を確認 これで2つの円錐ではなく、指定された方向のみの単一円錐状光跡が表示されます!