⚠️ 訂正(重要): 本ドキュメントの中心的結論「下灯 2.1× は直接光効率の幾何的優位で物理的に正しい/意図した設計」は誤りである.その後の実機単灯データとの突き合わせで,
lights.pyの面光源スケールに座標軸取り違えバグ(高さを縦 Y でなく潰れた奥行き Z に入れ,LED が「幅 3 mm × 高さ 2 m」の巨大ストリップ化)が見つかり,下灯 2.1× はこのバグのアーティファクトだったと判明した.修正後は 3 灯がほぼ均等(実機どおり・下灯最暗)になる.本ドキュメントの数値・「形」の観察・物理的考察(特に §結果〜§bottom が 2.1× 強い理由)はバグ込みの出力に基づくため,そのまま信用しないこと.詳細・修正・再検証は TEST_08 面光源スケール軸バグの発見と修正 を参照.
本ドキュメントは シミュレーションが下/右/左の 3 つの LED 基板を物理位置どおりに独立にモデル化できているか を,各グループの LED だけを ON にした輝度マップの形と数値で検証した結果のレポートである.Step 8 系キャリブの主軸ではなく シミュ動作の基礎健全性確認 として位置付ける.
動機: Step 8 系で「実機 vs シミュの残差 2.63×」を追っている過程で,シミュレーション側の動作が物理どおりに動いているかの確認が不十分だった.特に:
これらは「実機との残差は何が主因か」を議論する前提として担保すべき性質.
configs/scene_baseline.yaml の lights から各グループの LED だけを残した一時 YAML を生成sm-render を実行(spp=1024, max_depth=8)luminance.npy)を取得して 1×3 並列比較パネルを生成| グループ | 残した LED | LED 数 |
|---|---|---|
bottom | led_bottom_0 〜 led_bottom_5 | 6 個 |
right | led_right_0 〜 led_right_5 | 6 個 |
left | led_left_0 〜 led_left_5 | 6 個 |
スクリプト: scripts/sanity_led_groups.py(3 ジョブ順次実行)+ scripts/build_led_group_sanity_panel.py(6 列パネル + 線形性誤差)+ 拡大確認用の 1×3 / 1×2 パネル生成.
成果物(本ドキュメントの数値・図はすべて修正前=バグ込み.バグ実在の経緯は TEST_08):
output/led_group_sanity/{bottom,right,left}/luminance.npy(修正前の生データ=実験記録として保持)output/_slide_panels/led_group_sanity_buggy.png (6 列: ①〜③ 単独 / ④ 全 ON / ⑤ 和 / ⑥ 線形性誤差.BEFORE FIX 明記・ROI 揃え)output/_slide_panels/led_group_sanity_focus_buggy.png (1×3 拡大,BEFORE FIX)output/_slide_panels/led_group_sanity_right_left_buggy.png (1×2 左右対称性確認,BEFORE FIX)led_group_sanity{,_focus,_right_left}.png(sanity_fix_1024/baseline_fix_1024 由来,3 灯均等・線形性 OK.TEST_08 の検証結果に対応)| グループ | mean | max | min | グループ単独で見える最強点 |
|---|---|---|---|---|
| ① bottom (6 LED) | 98.82 | 157.77 | 0.00 | 評価板の下端中央 |
| ② right (6 LED) | 47.10 | 81.42 | 0.00 | 評価板の右側面寄り(やや上下に分散) |
| ③ left (6 LED) | 47.08 | 84.03 | 0.00 | 評価板の左側面寄り(やや下寄り) |
→ right と left の mean が一致 (47.10 vs 47.08) で 左右対称性 ✓.bottom が right/left の 2.10× で強い.
3 つの輝度マップは形が明確に異なる:
| グループ | 形の特徴 |
|---|---|
| bottom | 評価板の 下端中央が縦長の島状に明るい.Y 方向単調勾配(下が明るく上が暗い).直接光が支配的 |
| right | 評価板の中心寄りに円状のホットスポット+上下成分も強い.右側面寄りが直接光,中央が反射光 |
| left | right と類似(中心円 + 上下成分)だが Y 方向の重心がやや下寄り.完全な左右対称ではない |
→ ユーザー観察「bottom は上下の島,right/left は中心の円」は 物理的に LED 配置に対応 した正しい観察.
configs/scene_baseline.yaml の LED 座標から,形の違いを物理的に説明する:
| グループ | LED 中心座標 | 評価板との幾何関係 |
|---|---|---|
| bottom | X∈[-10, +18], Y=-71, Z=-66.1 | 評価板下端 (Y=-51) より 20 mm 下.X 方向に密集([-10, +18] の 27 mm 幅) |
| right | X=+66, Y∈[-25, +3], Z=-66.0 | 評価板右端 (X=+49.5) より外側 16.5 mm.Y 方向に分散([-25, +3] の 27 mm 幅,評価板 Y 中央付近) |
| left | X=-66, Y∈[-33, -5], Z=-66.0 | 評価板左端 (X=-49.5) より外側 16.5 mm.Y 方向に分散([-33, -5] の 27 mm 幅,評価板 Y 中央やや下) |
評価板: X∈[-49.5, +49.5], Y∈[-51, +51], 中心 Z≈-4.5.全 LED の光軸は +Z 方向(評価板向き).
LED が 評価板の下端の真下に X 方向で密集.直接光は評価板の 下端中央を縦長に照らす.LED の X 範囲 [-10, +18] が評価板 X 範囲 [-49.5, +49.5] のごく中央部に収まるため,X 方向の幅は狭い(島状)が,Y 方向には下端から評価板全体に届く.Y 方向単調勾配が支配的.
LED が 評価板の側面外側に Y 方向で分散.LED の Y 範囲 [-25, +3] は評価板 Y 範囲 [-51, +51] のうち 中央寄り.これにより:
ユーザー仮説「下成分の影響力が強い = 反射少なめで当たる量が多い」は 物理的に正しい.主因は以下の幾何的効率の違い:
LED から評価板中央(X=0, Y=0, Z=-4.5)への直線方向の +Z 軸(光軸)からの角度:
| グループ | LED 代表位置 | 評価板中央への方向 | +Z からの角度 |
|---|---|---|---|
| bottom (X≈+4, Y=-71, Z=-66) | (+4, -71, -66) → (0, 0, -4.5) | (-4, +71, +61.5) | arctan(√(4²+71²)/61.5) ≈ 49° |
| right (X=+66, Y≈-11, Z=-66) | (+66, -11, -66) → (0, 0, -4.5) | (-66, +11, +61.5) | arctan(√(66²+11²)/61.5) ≈ 47° |
意外にも 角度はほぼ同じ(49° vs 47°).これだけでは説明できない.
bottom LED は評価板の 真下 (Y 軸 +Z 方向) に集中している → 評価板の 広い範囲が立体角内に入る.Lambertian 配光は +Z 方向に最大の放射輝度で、評価板の 広範囲を直接照射できる.
一方 right/left LED は評価板の 側面外側に位置 → 直接光は評価板の 側面の端部しか届かない.評価板の中央〜反対側まで光を運ぶには 内壁多重反射が必要.多重反射は反射率 R=0.85 で減衰し、各バウンスで cos 重みで散乱するので 直接光の効率より大幅に下がる.
| グループ | LED 代表点 → 評価板裏面中心 (0,0,-4.5) の距離 |
|---|---|
| bottom (+4, -71, -66) | √(4² + 71² + 61.5²) = 94 mm |
| right (+66, -11, -66) | √(66² + 11² + 61.5²) = 91 mm |
距離自体はほぼ同じ.光量の差は距離ではなく 「直接光で評価板全体を照らせるか」 の幾何効率に由来.
bottom は評価板の真下から直接照射型 であり,right/left は側面照射+多重反射型 という構造的な違いがある.bottom の 2.10× の優位性は:
これは実機の照明設計としても 意図したもの(bottom LED の方が「主光源」に近い役割)と考えられる.
3 グループの輝度マップを足し合わせると、本来 Mitsuba の path tracer は 厳密に線形なので「①+②+③ = ④(全 18 個 ON)」が成り立つはず.しかし数値は:
| 項目 | mean |
|---|---|
| ① bottom | 98.82 |
| ② right | 47.10 |
| ③ left | 47.08 |
| ①+②+③ の和 | 193.00 |
④ 既存 output/baseline/luminance.npy の全 ON | 139.98 |
| 相対誤差 mean | +37.87% |
→ **比較対象の output/baseline/luminance.npy の生成時刻が 2026-05-18(Step 8-1 時点)**であり、現在の configs/scene_baseline.yaml(Step 8-9 で LED 位置を Fusion STL から再抽出して更新済)と 不整合であることが判明.
| ファイル | 生成時刻 | 対応する scene 設定 |
|---|---|---|
output/baseline/luminance.npy | 2026-05-18 (Step 8-1) | 旧 LED 位置(等間隔 8.7 mm) |
output/baseline_v3_leds/luminance.npy | 2026-05-28 (Step 8-9) | 現在の LED 位置(3+ギャップ+3) |
線形性自体の検証は、最新シーンで baseline を再生成して再比較する必要がある(本 sanity check の範囲外).Mitsuba は理論的に線形なので 再生成すれば一致するはず.
| 観点 | 結論 |
|---|---|
| 方向性(各単独 ON で光が LED 基板側から来ている) | ✓ bottom 単独で下端中央、right/left 単独で側面寄りが明るい |
| 対称性(right と left の対称) | ✓ mean がほぼ同じ (47.10 vs 47.08)、形も対称(Y 中心オフセットを除く) |
| 量的バランス(bottom が right/left より強い理由) | ✓ 物理的に整合(直接光効率の違い) |
| 線形性(厳密な数値合致) | ✗ 既存 baseline が古いため未検証.Mitsuba は理論線形なので再生成で一致すると予想 |
→ シミュレーションは 3 つの照明源を物理位置どおりに独立にモデル化できている.Step 8 系の残差 2.63× を議論する前提は担保された.
output/baseline/luminance.npy が Step 8-1 時代のまま放置されていたことが発覚.今後の比較で混乱を招く可能性があるため、再生成または明示的に古い旨を記載すべき.output/led_group_sanity/ のアーティファクト索引scripts/sanity_led_groups.py / scripts/build_led_group_sanity_panel.py