diff --git a/CLAUDE.md b/CLAUDE.md index 56d7a8e..27e09ec 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -153,3 +153,4 @@ - バッフル導入と球半径スイープ: docs/06_TEST/TEST_15_バッフル導入と球半径スイープ.md(LED 壁面密着+バッフルで直接光を遮る新構成と,球内半径 88〜250mm のスイープ.ロフト接合の 2 段階の作り直しで「大きいほど悪化」が逆転し,板直下の喉が最大のレバーと判明した経緯) - 立方体キャビティ導入と球との比較: docs/06_TEST/TEST_16_立方体キャビティ導入と球との比較.md(ロフト・接合・喉の無い立方体を L=120〜360mm でスイープし内面積で球と対応づけ.同面積なら立方体が一貫して均一で,四隅の写り込みは m=4 方位フーリエで検出限界以下と確認) - オフ軸 LED 配置の影響とサイズ依存: docs/06_TEST/TEST_17_オフ軸LED配置の影響とサイズ依存.md(LED を側壁に置いた非対称の定量.サイズとともに減衰するが,頑健性は球 > 立方体で軸上の優劣と逆転.明るくなるのは LED の反対側) +- 照明配置依存性の球と立方体の比較: docs/06_TEST/TEST_18_照明配置依存性の球と立方体の比較.md(LED の位置 θ・向き・個数を同内面積ペアで振った 198 条件.配置依存は球が立方体の 1/2〜1/3,球は軸上より θ≈30° が均一,対向 2 灯以上で形状差が消え真下向きならバッフル不要) diff --git "a/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" index e3ba27a..3237bfa 100644 --- "a/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" +++ "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" @@ -15,7 +15,7 @@ | コマンド | 役割 | 実装 | | --- | --- | --- | | `uv run sm-render ` | シーン YAML をレンダリングし PNG / luminance.npy を出力(`--variant` で Mitsuba variant を上書き可) | `cli/render.py` | -| `uv run sm-evaluate <入力> ` | PNG / luminance.npy を評価し metrics.csv + figures/ を出力 | `cli/evaluate.py` | +| `uv run sm-evaluate <入力> ` | PNG / luminance.npy を評価し metrics.csv + figures/ を出力(`--no-figures` で図を省き指標だけ出す.描画分 約 2 秒が省ける) | `cli/evaluate.py`(本体は `evaluation/pipeline.py:evaluate_image`) | | `uv run sm-visualize ` | シーンを 3D 表示 / スクリーンショット出力 | `cli/visualize.py` | | `uv run sm-remote <サブコマンド>` | 研究室サーバでの計算(コード送信・tmux でのジョブ起動・状態確認・結果取得).下記「研究室サーバでの実行」参照 | `cli/remote.py` | @@ -89,6 +89,7 @@ uv run sm-remote run --name offaxis --gpu 0 -- python scripts/sweep_offaxis_led.py uv run sm-remote run --name r100 --gpu 0 -- sm-render --scene configs/scene_sphere_r100.yaml --output output/r100 uv run sm-remote run --name cpu --yaml-variant --threads 16 -- sm-render --scene configs/scene_baseline.yaml --output output/cpu +uv run sm-remote run --name place --gpu 0 --threads 16 -- python scripts/sweep_led_placement.py --workers 2 # スイープ(GPU 1 枚・2 並列) # 様子を見る・止める uv run sm-remote logs offaxis # ログ末尾(-n 行数) @@ -105,7 +106,9 @@ - `run` は既定で `SM_RENDER_VARIANT=cuda_ad_rgb` を渡す(sm-render が YAML の variant より優先して使う.GPU は手元の CPU の 37〜72 倍速く,Newton の `llvm_ad_rgb` と結果が一致することを 2026-09-13 に確認済み).YAML の variant のまま回すときは `--yaml-variant` - レンダ結果は,同じコード・同じ YAML・同じ seed でも**実行ごとに画素単位で変わる**(GPU・CPU とも.2026-09-13 に Newton で確認).同じシーンオブジェクトを 2 回レンダした差は丸め誤差(並列加算の順序)だけで平均も一致するが,シーンを読み込み直すと約 97% の画素が MC ノイズ程度に変わる(平均の差 3〜7e-4).コーネルボックスでは読み込み直しても丸め誤差だけなので,このシーン固有の現象.読み込み時に並列で作られる加速構造かサンプリング用の表の丸め差が,最大 16 回の反射で経路の分岐として増幅されていると推定している(どちらかは未切り分け).sm-render は毎回シーンを読み込むので,1 回ごとに別のノイズ実現と考える.集計指標の条件比較には問題ないが,画素単位で過去のレンダと突き合わせる用途には向かない - CPU(`llvm_*` / `scalar_*`)で回すときは `--threads N` で Dr.Jit のスレッド数に上限を付ける(共用サーバの 64 スレッドを占有しないため) -- GPU で回すときの CPU 負荷は小さい(球 10 条件のスイープで CPU は平均 156%・最大 342%=64 スレッド中 1.5〜3.4 スレッド分.2026-09-13 実測).スイープ全体の時間の大半は CPU 側の形状生成・シーン読み込み・評価で GPU 使用率は平均 3% なので,1 本のスイープに GPU は 1 枚(`--gpu`)で足りる +- GPU で回すときの CPU 負荷は小さい(球 10 条件のスイープで CPU は平均 156%・最大 342%=64 スレッド中 1.5〜3.4 スレッド分.2026-09-13 実測).1 本のスイープに GPU は 1 枚(`--gpu`)で足りる +- **スイープの 1 条件あたりの内訳**(`scripts/profile_sweep_step.py` で計測.2026-09-14 Newton GPU 0・spp=1024・512²): GPU のレンダ本体 4.4〜5.2 秒が床.旧方式(`uv run sm-render` / `sm-evaluate` をサブプロセスで呼ぶ)はそれに起動・import・YAML・PLY 書き出しで約 2.5 秒,図の描画で約 2 秒が乗り,さらに遮蔽検証(`verify_baffle_occlusion`)を YAML の llvm で回すと球で約 25 秒かかっていた.`scripts/sweep_led_placement.py` 以降のスイープは `render/pipeline.py:render_yaml` と `evaluation/pipeline.py:evaluate_image(save_figures=False)` をプロセス内で呼び,`runner.ensure_variant` で先に cuda を確定してから遮蔽検証する(球 40 秒 → 約 6 秒,立方体 13 秒 → 5.5 秒).`--workers N` で同じ GPU に複数プロセスを載せられるが,GPU 律速なので実測は 1→5.5 秒・2→5.0 秒・3→4.5〜5.8 秒(1 条件あたり).**`--workers 2` を既定の推奨**とする(CPU 側の処理を隠す分だけ得.3 以上は効果なし) +- 同一シーンを seed を変えずに再レンダしても集計指標は 4 桁まで一致する(画素はノイズ程度に変わるが集計では消える).**ノイズフロアを測るときは `render.seed` を変える**(`RenderConfig.seed`.`sweep_led_placement.py` の再現性条件は rep ごとに seed を変えた YAML を書く) - GPU は `status` で空きを見てから `--gpu` で指定する(未指定だと CUDA は 0 番を使う).その他の環境変数は `--env KEY=VALUE` で渡せる - サーバで pytest を回すときは `--yaml-variant` を付ける(variant の上書きをテストに持ち込まないため): `uv run sm-remote run --name pytest-all --yaml-variant -- python -m pytest -m ""` - 各サブコマンドの詳細は `uv run sm-remote <サブコマンド> --help`.接続先は `--host` / `--remote-dir` で変えられる diff --git "a/docs/04_SPEC/SPEC_02_\343\202\267\343\203\274\343\203\263\345\256\232\347\276\251\344\273\225\346\247\230.md" "b/docs/04_SPEC/SPEC_02_\343\202\267\343\203\274\343\203\263\345\256\232\347\276\251\344\273\225\346\247\230.md" index d56c026..b28e727 100644 --- "a/docs/04_SPEC/SPEC_02_\343\202\267\343\203\274\343\203\263\345\256\232\347\276\251\344\273\225\346\247\230.md" +++ "b/docs/04_SPEC/SPEC_02_\343\202\267\343\203\274\343\203\263\345\256\232\347\276\251\344\273\225\346\247\230.md" @@ -186,9 +186,12 @@ integrator: path # path | direct | volpath | ptracer max_depth: 8 spp: 256 # サンプル数 + seed: 0 # 乱数シード(省略時 0・0 以上) ``` `integrator` の `ptracer` はフォワード光線追跡(光源→センサ)の粒子トレーサー. +`seed` は `mi.render` に渡す乱数シード.同じ seed のまま再レンダしても集計指標は実質同じ値になるため, +ノイズフロアを測る再レンダでは seed を変える(ENV_04「研究室サーバでの実行」参照). ### evaluation(任意) diff --git "a/docs/06_TEST/TEST_02_\343\202\267\343\203\237\343\203\245\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\345\256\237\350\241\214\350\250\230\351\214\262.md" "b/docs/06_TEST/TEST_02_\343\202\267\343\203\237\343\203\245\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\345\256\237\350\241\214\350\250\230\351\214\262.md" index 79a1a5c..5a3c651 100644 --- "a/docs/06_TEST/TEST_02_\343\202\267\343\203\237\343\203\245\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\345\256\237\350\241\214\350\250\230\351\214\262.md" +++ "b/docs/06_TEST/TEST_02_\343\202\267\343\203\237\343\203\245\343\203\254\343\203\274\343\202\267\343\203\247\343\203\263\345\256\237\350\241\214\350\250\230\351\214\262.md" @@ -91,6 +91,8 @@ | `output/cube_size_sweep/_anchor_check_mitsuba371/L120/` | TEST_16 | `configs/_tmp_cube_size/scene_board_baffle_L120.yaml`(本体スイープと同一.mitsuba **3.7.1** でレンダ) | 同上 | 3.8.0 版と比較して構造 CoV 一致(0.0379)・輪帯 min/max 差 +0.0002・輪帯プロファイル最大差 1.17σ | mitsuba 3.8.0→3.7.1 固定(SAC が `IlmThread-mitsuba.dll` をブロック)の等価性検証アンカー.バージョン混在の妥当性の根拠 | | `output/offaxis_led_sweep/` (10 ディレクトリ) | TEST_17 | `configs/_tmp_offaxis/scene_offaxis_*.yaml`(`scripts/sweep_offaxis_led.py` が生成.LED を**深さ方向軸の中点の高さ・+X 側の壁面**に置き板中心 (0,0,-4.5) へ向けた board_baffle 構成.球 similar_radial r ∈ {88, 100, 135, 170, 250} + 立方体 L ∈ {120, 160, 200, 280, 360}.バッフルは視線上 10mm・数値サイジング.材質・spp=1024・d=16 据え置き・mitsuba 3.7.1) | `configs/eval_baseline_dng_target_shape.yaml` | m=1 符号付き a1 が全条件で負(LED 側が暗い)= -1.6〜-7.2%.サイズとともに約 4 割まで減衰.位置ずれの Δ構造CoV は球 ±0.006 以内・立方体 +0.010〜+0.033 — [TEST_17](TEST_17_オフ軸LED配置の影響とサイズ依存.md) 参照 | **オフ軸頑健性は球 > 立方体(軸上と逆転)**を実証.遮蔽は全 10 条件 55,473 本 100%(傾き追従の LED サンプルに一般化済み) | | `output/offaxis_led_sweep/{summary.csv,offaxis_comparison.png}`・`_placement_check/cutaway_*.png` | TEST_17 | — | — | 条件別集約 CSV/解析図(輝度マップ 2 行 + a1・重心・構造 CoV の内面積依存を軸上と重ね描き)/レンダ前 3D 確認の半割り断面 10 枚 | `scripts/build_offaxis_comparison.py`・`show_scene_cutaway.py` の出力.レンダ前 3D 確認(CLAUDE.md 必須ルール)の記録を兼ねる | +| `output/led_placement_sweep/` (198 ディレクトリ) | TEST_18 | `configs/_tmp_led_placement/scene_*.yaml`(`scripts/sweep_led_placement.py` が生成.同内面積ペア 球 r ∈ {100,135,170,250} ↔ 立方体 L ∈ {141,187,234,340} で,LED をキャビティ中心から見た極角 θ=0〜120°(13 段階)に置く位置スイープ・θ=60/90/120° の向き 3 通り(板向き+バッフル/壁法線向き+バッフル/真下向き)・θ=90° の輪に N=1〜4 灯(総光束保存)・seed 違いの再レンダ.材質・spp=1024・d=16 据え置き.Newton cuda_ad_rgb・mitsuba 3.7.1・`--workers 2` で 1 条件 5〜6 秒) | `configs/eval_baseline_dng_target_shape.yaml` | 配置依存の幅(θ 全域の構造 CoV max−min)は球 0.015〜0.023・立方体 0.025〜0.071.球は θ≈30° が軸上より均一(r=170: 0.0193→0.0057).対向 2 灯で構造 CoV 0.005〜0.010 と形状差が消える.真下向きはバッフル無しで板向きと同等 — [TEST_18](TEST_18_照明配置依存性の球と立方体の比較.md) 参照 | **配置依存は球が立方体の 1/2〜1/3**(仮説成立).図なし評価(`--no-figures`)なので各条件に figures/ は無い.`row.json` が条件ごとの集約行(並列・再開用) | +| `output/led_placement_sweep/{summary.csv,analysis.csv,position_summary.csv,position_sensitivity.png,position_maps.png,direction_comparison.png,count_comparison.png,analysis_report.txt}`・`_placement_check/cutaway_*.png` | TEST_18 | — | — | 条件別集約 CSV/方位フーリエ m=1〜4・構造 CoV・重心の解析 CSV/位置・向き・灯数の解析図 4 枚/レンダ前 3D 確認の半割り断面 18 枚 | `scripts/build_led_placement_comparison.py`・`show_scene_cutaway.py` の出力.レンダ前 3D 確認(CLAUDE.md 必須ルール)の記録を兼ねる | | `output/cube_size_sweep/board_baffle/{summary.csv,cube_vs_sphere.png,fourfold_component.png}`・`output/cube_size_sweep/_placement_check/cutaway_L*.png` | TEST_16 | — | — | 条件別集約 CSV/球との比較図(輝度マップ 5 枚 + 輪帯プロファイル + 内面積軸の指標カーブ + 直接ペア 3 組)/m=4(cos 4φ)成分の定量図/レンダ前 3D 確認の半割り断面 5 枚 | `scripts/build_cube_sphere_comparison.py`・`analyze_fourfold_component.py`・`show_scene_cutaway.py` の出力.m=4 は全条件 \|a4\| ≤ 0.26%(系統誤差床 ~0.1%)=四隅の写り込みは実質ゼロ.レンダ前 3D 確認(CLAUDE.md 必須ルール)の記録を兼ねる | | `output/_slide_panels/sphere_loft_disk_before_after.png`・`normal_artifact_explainer.png` | TEST_12 | — | — | 球ロフト円形光源の修正前後 1×2 比較(相対輝度・共通スケール)/法線アーティファクトの機構説明図(模式図+実物メッシュの補間法線再現+修正前マップの 4 パネル) | 発表スライド素材(アドホック生成.修正前後比較は CoV 0.1205→0.0628 の視覚版) | @@ -150,6 +152,7 @@ | レンダ前 3D 配置確認 (幾何変更時必須) | `uv run sm-visualize --scene --no-bake --screenshot ` + `uv run python scripts/show_led_geometry.py --scene --screenshot ` | | 球ロフト円形光源版レンダ・評価 (TEST_11 追補) | `$env:DRJIT_LIBLLVM_PATH = "C:\Program Files\LLVM\bin\LLVM-C.dll"; uv run sm-render --scene configs/scene_sphere_r100_loft_disk.yaml --output output/sphere_r100_loft_disk/` → `uv run sm-evaluate --image output/sphere_r100_loft_disk/luminance.npy --config configs/eval_baseline_dng_target_shape.yaml --output output/sphere_r100_loft_disk/` | | 単灯再検証レンダ・集計 (TEST_12 追補) | `$env:DRJIT_LIBLLVM_PATH = "C:\Program Files\LLVM\bin\LLVM-C.dll"; uv run sm-render --scene configs/_tmp_fix_{bottom,left,right}.yaml --output output/singles_fix/{bottom,left,right}/` → `uv run python scripts/build_singles_fix_summary.py` | +| 照明配置スイープ (TEST_18) | `uv run sm-remote push` → `uv run sm-remote run --name place --gpu 0 --threads 16 -- python scripts/sweep_led_placement.py --workers 2` → `uv run sm-remote pull led_placement_sweep` → `uv run python scripts/build_led_placement_comparison.py`(手元で幾何だけ確認するなら `--prepare-only`) | ## 過去の整理実績 (Cleanup History) diff --git "a/docs/06_TEST/TEST_18_\347\205\247\346\230\216\351\205\215\347\275\256\344\276\235\345\255\230\346\200\247\343\201\256\347\220\203\343\201\250\347\253\213\346\226\271\344\275\223\343\201\256\346\257\224\350\274\203.md" "b/docs/06_TEST/TEST_18_\347\205\247\346\230\216\351\205\215\347\275\256\344\276\235\345\255\230\346\200\247\343\201\256\347\220\203\343\201\250\347\253\213\346\226\271\344\275\223\343\201\256\346\257\224\350\274\203.md" new file mode 100644 index 0000000..aa55c77 --- /dev/null +++ "b/docs/06_TEST/TEST_18_\347\205\247\346\230\216\351\205\215\347\275\256\344\276\235\345\255\230\346\200\247\343\201\256\347\220\203\343\201\250\347\253\213\346\226\271\344\275\223\343\201\256\346\257\224\350\274\203.md" @@ -0,0 +1,204 @@ +# 照明配置依存性の球と立方体の比較 (Placement Dependence: Sphere vs Cube) + +TEST_16 で「軸上配置なら同内面積の立方体が球より均一」,TEST_17 で「側壁 1 点への +オフ軸配置では球のほうが頑健」と分かった.本実験は「積分球が使われる理由は照明配置への +依存が小さいからではないか」というユーザーの仮説を,**LED の位置(極角 θ を 0〜120° で +13 段階)・向き(3 通り)・個数(1〜4 灯)** を系統的に振って検証した(2026-09-14). +仮説は成立した.**球の配置依存は同内面積の立方体の 1/2〜1/3** で,しかも球は軸上より +少しずらした位置(θ≈30°)のほうが均一になる.立方体の優位は軸上の 1 点に限られる. +一方,**対向 2 灯以上の対称配置にすると形状差はほぼ消え**,どちらも単灯軸上より均一になる. + +関連: + +- 軸上の優劣と m 次方位フーリエ解析: [TEST_16_立方体キャビティ導入と球との比較](TEST_16_立方体キャビティ導入と球との比較.md) +- 側壁 1 点のオフ軸配置: [TEST_17_オフ軸LED配置の影響とサイズ依存](TEST_17_オフ軸LED配置の影響とサイズ依存.md) +- 実行記録: [TEST_02_シミュレーション実行記録](TEST_02_シミュレーション実行記録.md) +- サーバでの実行と高速化: [ENV_04 開発コマンド](../02_ENV/ENV_04_開発コマンド.md)「研究室サーバでの実行」 + +## 背景・動機 (Motivation) + +TEST_17 は側壁の 1 点(軸中点の高さ)だけを測ったので,「ずれ量に対する感度曲線」が +無く,向きや灯数の影響も不明だった.実機では LED の位置・向き・個数は基板やケースの +都合で決まるため,「どの配置でもそこそこ均一」=配置依存の小ささは筐体形状の実用上の +性能である.本実験はそれを 3 軸で定量し,球と立方体のどちらが配置に寛容かを決める. + +## 実験条件 (Setup) + +固定条件(材質 ρ=0.85 blendbsdf・spp=1024・max_depth=16・512²・評価板・LED 面積と +総光束・評価 YAML)は TEST_15〜17 と同一.球は similar_radial キャビティ. +レンダは研究室サーバ Newton の cuda_ad_rgb(mitsuba 3.7.1).全 198 条件. + +### 同内面積ペア + +| ペア | 球 r [mm] | 立方体 L [mm] | 内面積 [mm²] | +| --- | --- | --- | --- | +| 1 | 100 | 141 | 120,607 / 119,880 | +| 2 | 135 | 187 | 211,286 / 210,408 | +| 3 | 170 | 234 | 328,508 / 329,130 | +| 4 | 250 | 340 | 696,005 / 694,194 | + +### LED 位置の定義(両形状共通) + +キャビティ中心(球: 球中心,立方体: 立方体中心)から方向 (sinθ, 0, −cosθ) に伸ばした +半直線が内壁と交わる点に LED を置く.θ=0° が底の中心(=従来の軸上配置),90° が中心と +同じ高さの側壁,120° が評価板の直下(球は loft 接続の約 1° 下).立方体では θ<45° が +底面,θ>45° が側壁で,稜 45° はグリッドから外した.LED 円板は壁法線から発光方向へ傾け, +縁が壁を貫かない分だけ浮かせる(余裕 0.5mm を全条件で数値確認). + +### 条件群 + +| 群 | 条件 | 数 | +| --- | --- | --- | +| A 位置 | θ = 0, 10, …, 40, 50, …, 120°(13 段階)× 1 灯・板中心向き・バッフル | 104 | +| B 向き | θ = 60/90/120° × {板中心向き+バッフル, 壁法線向き+バッフル, 真下向き(バッフル無し)} | 48(うち 24 は A と共通) | +| C 個数 | θ=90° の輪に N=1/2/3/4 灯を等方位(総光束を保存=radiance/N)+ N=4 を θ=60/120° | 40(うち 8 は A と共通) | +| D 再現性 | ペア 3・θ=90°・1 灯を seed を変えて 3 回再レンダ | 6 | + +バッフルは TEST_17 と同じ数値サイジング(発光面の前方にある板の全点を隠す最小半径 +×1.05).板の近く(θ が大きい)や壁法線向きでは円板が壁を貫かざるを得ないので,本実験は +外殻の貫通を許容して食い込み量を記録した(外側に出た部分はキャビティ内から見えない). +真下向き(−Z)は板が発光面の背後になるので直接光がゼロでバッフル不要.遮蔽率は +バッフル付き全条件で 55,473〜221,892 本 100%(cuda でレイキャスト). + +## 結果 1 — 位置依存: 球は立方体の 1/2〜1/3 (Position Dependence) + +`position_sensitivity.png`.非対称は TEST_17 と同じ m=1 符号付き係数 a1(正=LED 側 +(+X)が明るい)で,直交成分 b1 ≤0.33% がノイズ対照. + +| 形状・サイズ | 構造 CoV 軸上 | θ 全域の平均 | 最大(最悪 θ) | 幅 max−min | max\|a1\| | +| --- | --- | --- | --- | --- | --- | +| 球 r=100 | 0.0311 | 0.0244 | 0.0311(0°) | 0.0153 | 4.1% | +| 球 r=135 | 0.0231 | 0.0199 | 0.0321(110°) | 0.0229 | 4.1% | +| 球 r=170 | 0.0193 | 0.0164 | 0.0289(120°) | 0.0232 | 3.8% | +| 球 r=250 | 0.0145 | 0.0121 | 0.0244(120°) | 0.0202 | 3.1% | +| 立方体 L=141 | 0.0280 | 0.0513 | 0.0951(120°) | 0.0671 | 9.6% | +| 立方体 L=187 | 0.0178 | 0.0403 | 0.0888(120°) | 0.0710 | 11.2% | +| 立方体 L=234 | 0.0139 | 0.0293 | 0.0652(120°) | 0.0514 | 8.3% | +| 立方体 L=340 | 0.0096 | 0.0182 | 0.0348(120°) | 0.0252 | 4.5% | + +- **配置依存の幅は立方体が球の 1.2〜3.1 倍,非対称の最大は 1.5〜2.7 倍**.θ 全域の平均 + 構造 CoV も全ペアで立方体が悪い(1.5〜2.1 倍) +- **立方体は θ とともに単調に悪化**し,板の直下(θ=120°)で軸上の 3.4〜5.0 倍.底面上 + (θ≤40°)でも a1 は既に −2〜−6% ある(平らな床に置いた LED は近い側壁を強く照らす) +- **球は軸上が最良ではない**.θ=20〜40° で構造 CoV が最小(r=170: 0.0193 → 0.0057, + r=250: 0.0145 → 0.0043)になり,軸上の同心円状のリング構造(TEST_15 のドーム)が + 崩れて平坦になる.θ≥90° で軸上と同程度に戻り,最悪でも軸上の 1.0〜1.7 倍 +- 立方体の軸上の優位(TEST_16)は確認できる(ペア 2〜4 で球の 0.66〜0.77 倍)が, + **軸上の 1 点だけ**であり,θ=10° でも立方体は a1 が −1.7〜−2.5% 出る +- a1 の符号: 球は θ=10〜20°(r≥135)で **正**(LED 側が明るい)になり,θ が大きくなると + 負に転じる.小さな傾きでは LED に近い壁の一次照射が勝ち,傾きが増すと反対側の壁の + 一次照射キャップ(TEST_11/17)が支配する,と解釈できる(未検証) + +## 結果 2 — 向き: 真下向き(バッフル無し)は板向き+バッフルと同等 (Direction) + +`direction_comparison.png`.θ=60/90/120° × 3 向き × 4 ペア × 2 形状. + +- **真下向き(−Z・バッフル無し)は板中心向き+バッフルと同等**(構造 CoV の比 0.6〜1.3. + 球の大サイズではむしろ良く,r=250・θ=120° で 0.0244 → 0.0138).生 mean も 5〜30% + 明るい(バッフルが吸う分が無い).**LED を板と反対側へ向けるだけで,バッフル無しで + 板向きバッフル構成と同じ均一性が得られる** +- **壁法線向き(キャビティ中心向き)は最悪**.構造 CoV は板向きの 2〜5 倍(立方体 L=141 + で 0.19〜0.23).反対側の壁にできる一次照射キャップが板から正面に見えるうえ,それを + 遮るバッフルが大きく(半径がキャビティ寸法の 5〜44%),キャビティ内に影を作る. + 球 r=100・θ=120° の壁法線向きはバッフル半径が r の 59% になり板への光がほぼ消えた + (生 mean 0.000)ため無効条件として除外する +- 向きの影響は形状差より大きい: 同じ位置でも向きで 2〜5 倍変わる + +## 結果 3 — 個数: 対向 2 灯以上で形状差は消える (Count) + +`count_comparison.png`.θ=90° の輪に等方位・総光束一定. + +| 形状・サイズ | N=1 | N=2 | N=3 | N=4 | 参考: 軸上 1 灯 | +| --- | --- | --- | --- | --- | --- | +| 球 r=100 | 0.0308 | 0.0084 | 0.0057 | 0.0059 | 0.0311 | +| 球 r=170 | 0.0202 | 0.0053 | 0.0044 | 0.0043 | 0.0193 | +| 球 r=250 | 0.0136 | 0.0054 | 0.0052 | 0.0054 | 0.0145 | +| 立方体 L=141 | 0.0554 | 0.0098 | 0.0208 | 0.0089 | 0.0280 | +| 立方体 L=234 | 0.0323 | 0.0049 | 0.0089 | 0.0047 | 0.0139 | +| 立方体 L=340 | 0.0208 | 0.0067 | 0.0062 | 0.0064 | 0.0096 | + +- **対向 2 灯で m=1 は ≤0.3% に消え**,構造 CoV は 1 灯の 1/4〜1/6.**単灯軸上より均一** + になる(球・立方体とも全サイズで) +- N=4 でも N=2 とほぼ同じ.**2 灯以上では球と立方体の差は 0.001〜0.004 に縮み**, + 最大サイズでは立方体が僅かに良い +- **N=3 は立方体で崩れる**(\|m1\| 0.4〜2.4% 残る.3 回対称の配置が 4 回対称の壁と + 噛み合わない)が球では問題ない(≤0.12%).**立方体は灯数を壁の対称性に合わせる必要** + がある +- N=4 を θ=120°(板の直下)に置くと立方体は再び悪化する(L=141: 0.0089 → 0.0313)が + 球は ≤0.008 に留まる.多灯でも位置の寛容さは球が上 + +## 結果 4 — ノイズフロア (Noise Floor) + +seed を変えた 3 回の再レンダ(ペア 3・θ=90°・1 灯): 構造 CoV は球 0.0207±0.0007, +立方体 0.0326±0.0005,a1 は ±0.08%.本実験で論じた差はすべてこの 10 倍以上. +**seed を変えずに再レンダしても指標は 4 桁まで一致する**(画素はノイズ程度に変わるが +集計で消える)ため,再現性条件は `render.seed` を変えた YAML にした. + +## 結論 (Conclusions) + +- **仮説成立**: 照明位置への依存は球が同内面積の立方体の 1/2〜1/3.球は軸上より θ≈30° + のほうが均一で「どこに置いてもそこそこ」,立方体は軸上の 1 点だけが良く,板に近づく + ほど急激に悪化する +- **向き**: 板と反対(真下)に向ければバッフル無しで板向きバッフル構成と同等. + キャビティ中心へ向ける(壁法線向き)のは最悪 +- **個数**: 対向 2 灯以上の対称配置で形状差は消え,どちらも単灯軸上より均一.立方体は + 灯数を 2 か 4 にする(3 は不可) +- **設計への含意**: 単灯なら球.多灯にできるなら「側壁の対向 2〜4 灯・真下向き・ + バッフル無し」が最も簡単で,そこまでやれば立方体でも球と同等 + +## 限界・注意点 (Limitations) + +- 方位角は +X(立方体では面の中央)のみ.稜に寄せた配置・N=3 の方位依存は未測定 +- 壁法線向きのバッフルはキャビティ寸法の 5〜44% と大きく,実物の設計として妥当かは別問題 + (結果は「その向きに置くと大きなバッフルが要る」ことも含めた評価) +- 材質は旧条件(ρ=0.85 blendbsdf).絶対値の実機予測には校正値での引き直しが必要 +- 真下向きの球 θ=60° は発光面の半分が壁を向く(発光方向と壁法線が 120°).物理的には + 「壁際に伏せた LED」で成立するが,実装の都合で選んだ向きである + +## 失敗パターン・方法論の学び (Pitfalls and Methodology) + +- **同一 seed の再レンダはノイズフロアにならない**.シーンを読み直しても集計指標は 4 桁 + まで一致した.ノイズフロアを測るなら `render.seed` を変える(本実験で schema に追加) +- **遮蔽検証は cuda で回す**.YAML の llvm のまま呼ぶと球で 1 条件 25 秒かかり, + スイープの主犯だった(`runner.ensure_variant` で先に variant を確定してから呼ぶ) +- **バッフルの上限を設けること**.壁法線向きで LED が板に近いと,板を掠める直接光を + 遮る円板がキャビティ寸法の半分を超え,条件として無意味になる(半径 0.6×寸法で打ち切り, + 0.3 超は図に † を付けた) +- 立方体の θ は稜(45°)を避ける.半直線が稜に当たると法線が定義できず LED 円板が + 両壁に掛かる + +## 次にやること (Next Steps) + +1. 方位角依存: 立方体の面中央 vs 稜寄りで位置依存がどう変わるか +2. 「真下向き・バッフル無し」の多灯版(対向 2〜4 灯,底の輪 N=4〜8)=実機で最も簡単な構成の評価 +3. a1 の符号反転(球 θ=10〜20°)の機構の確認(一次照射キャップの位置) +4. 校正材質(ρ≈0.81 純 diffuse)での引き直し + +## 再現コマンド (Reproduction) + +```bash +# 幾何生成のみ(3D 配置確認用) +uv run python scripts/sweep_led_placement.py --prepare-only +uv run python scripts/show_scene_cutaway.py --scene configs/_tmp_led_placement/scene_cube_L234_th090_board_n4.yaml \ + --output output/led_placement_sweep/_placement_check/cutaway_cube_L234_th090_board_n4.png + +# スイープ本体(研究室サーバ・GPU 1 枚・2 並列.1 条件 5〜6 秒) +uv run sm-remote push +uv run sm-remote run --name place --gpu 0 --threads 16 -- python scripts/sweep_led_placement.py --workers 2 +uv run sm-remote pull led_placement_sweep + +# 解析図 + 集約表 +uv run python scripts/build_led_placement_comparison.py +``` + +出力: `output/led_placement_sweep/`(条件別 198 ディレクトリ + `summary.csv` + `analysis.csv` + +`position_summary.csv` + `position_sensitivity.png` / `position_maps.png` / +`direction_comparison.png` / `count_comparison.png`).レンダ前 3D 確認は +`_placement_check/cutaway_*.png`(代表 18 条件). + +## 参照 (References) + +- [TEST_16_立方体キャビティ導入と球との比較](TEST_16_立方体キャビティ導入と球との比較.md): 軸上の優劣と方位フーリエ解析 +- [TEST_17_オフ軸LED配置の影響とサイズ依存](TEST_17_オフ軸LED配置の影響とサイズ依存.md): 側壁 1 点のオフ軸配置とバッフルの数値サイジング +- [TEST_11_球体筐体実験](TEST_11_球体筐体実験.md): 一次照射キャップの機構 +- [TEST_02_シミュレーション実行記録](TEST_02_シミュレーション実行記録.md): 出力ディレクトリの索引