本ドキュメントは,TEST_08 面光源スケール軸バグ の修正後もなお残る**「照明分布の“形”が実機と一致しない」問題**について,原因を実験で切り分けていく継続記録である.
最優先の判定基準: 本調査は CoV/勾配などの**数値の絶対量ではなく,実機マップとの「形の一致」**を唯一の判定基準とする.形が一致しない限り「筐体を仮想的に変えて結果を予測する」というツール本来の目的(筐体改善の事前検討)が成立しないため.判定には実機マップを参照とした NCC/SSIM + 視覚比較 + 放射プロファイルを用い,peak/mean(中心の尖り具合)を補助指標とする.
TEST_08 の面光源バグ修正で灯間バランス(下灯 2.1×)は解消したが,各単灯・合成の分布の形は実機と一致しないまま:
比較図: output/_slide_panels/sim_vs_real_shape_fixed.png / sim_vs_real_colormap_fixed.png
実機ハードの確認結果(ユーザー回答):
LED基板カバー*.stl)は筐体と同じ不透明白材(3D プリンタ白フィラメント,printer_white).光は透過しない.含意:実機単灯のあの「平らさ」を作っているのは光学部品ではなく,白い筐体内の多重反射(積分球的な拡散)でしかありえない.逆に言えば,形を再現する鍵は新部品ではなく筐体(反射+幾何)の正しいモデル化にある.
PROGRESS に記録された「A8 反射率・A9 max_depth・A1 BSDF を振っても形は変わらない」という Step 8-14 の結論は,すべて面光源バグ(2m 縦長ストリップ)が入った状態で得たものであり,TEST_07 と同様に再検証が必要.特に「筐体が光をかき混ぜて平らにする」効果は反射回数・反射率に依存するはずで,バグで巨大ストリップが支配していたため形が動かなかった可能性がある.本調査は修正後の正しい LED でやり直す.
「形を平らにするレバーが現エミッタで存在するか」を確かめる第一歩.bottom 単灯のみ・spp=1024 固定で,max_depth 以外をすべて一定にし,反射回数を {1, 2, 4, 8, 16, 32} で振る.「バウンスを増やすほど実機の平らな形に近づくか/頭打ちか」を見る.
configs/_tmp_depth_bottom/d{1,2,4,8,16,32}.yaml(_tmp_sanity_1024/scene_bottom.yaml ベース,max_depth のみ変更)output/depth_bottom/d{N}/luminance.npyoutput/_slide_panels/depth_bottom_shape.png| max_depth | mean | peak/mean | SSIM(対実機) | NCC(対実機) |
|---|---|---|---|---|
| 1 | 0.000(真っ暗) | – | – | – |
| 2 | 0.000(真っ暗) | – | – | – |
| 4 | 1.474 | 2.223 | 0.428 | 0.690 |
| 8 | 3.484 | 1.815 | 0.425 | 0.688 |
| 16 | 4.678 | 1.653 | 0.396 | 0.670 |
| 32 | 4.904 | 1.657 | 0.397 | 0.666 |
| 実機 bottom | – | 1.218 | – | – |
実験1で「混ぜ不足ではない」と分かったため,「反射率が足りないだけ」なのか「幾何が漏れている」のかを切り分ける.bottom 単灯・spp=1024・max_depth=16 固定(実験1で d16≈d32 と反射飽和を確認済み)で,筐体材 printer_white の反射率を {0.85, 0.90, 0.95, 0.98} に上げる.holder_dark(0.5)・phone_body_dark(0.05) は据え置き.
configs/_tmp_refl_bottom/r{90,95,98}.yaml(R=0.85 は実験1の output/depth_bottom/d16 を再利用)output/refl_bottom/run_r{90,95,98}/luminance.npyoutput/_slide_panels/refl_bottom_shape.png| R (printer_white) | mean | peak/mean | top/bot | SSIM(対実機) | NCC(対実機) |
|---|---|---|---|---|---|
| 0.85 | 4.678 | 1.653 | 0.867 | 0.396 | 0.670 |
| 0.90 | 6.594 | 1.602 | 0.878 | 0.411 | 0.659 |
| 0.95 | 9.468 | 1.460 | 0.888 | 0.410 | 0.649 |
| 0.98 | 11.874 | 1.441 | 0.894 | 0.415 | 0.640 |
| 実機 bottom | – | 1.218 | 0.931 | – | – |
| レバー | 実験 | 形への効果 | 判定 |
|---|---|---|---|
| 反射回数 max_depth | 実験1 | d16 で頭打ち,peak/mean 1.65 止まり | 本筋でない |
| 反射率 R | 実験2 | R=0.98 でも 1.44 止まり,NCC 改善せず | 本筋でない |
| 筐体幾何 B1 | 実験3(予定) | — | 最有力 |
「光がどこから逃げているか/箱が閉じているか」を直接調べる:
実機マップは LSC 補正済み(dng_luminance(apply_lsc=True)).LSC はレンズ周辺減光を割り戻す処理で本来は照明分布を平らにしないはずだが,「実機の平らさが本物の照明分布か,処理由来か」を実験3 前に一度確認しておくと安全(TECH_07 LSC 取り扱い方針 参照).
なぜ光源の形(点 vs 2m 帯)を変えても板の形がほとんど変わらないのか(TEST_08 §修正前後のカラーマップ比較)の物理的根拠は,板が「間接光のみ(LED は板に背を向け,depth=1,2 が真っ暗)+ Lambertian 拡散壁」で照らされ,形が光源でなく筐体で決まるため.拡散壁での多重反射が光源の形状情報を洗い流す(積分球の原理;壁が鏡面なら光源形状が板に焼き付くが Lambertian なので消える).
この帰結として,修正後シミュでは下・左・右の 3 単灯の「形」が互いにほぼ同一になる(同じ筐体に光を注ぐため):
| 灯 | peak/mean | top / bot | imgleft / imgright |
|---|---|---|---|
| bottom | 1.71 | 0.852 / 1.064 | 0.961 / 0.955 |
| left | 1.62 | 0.848 / 1.067 | 0.951 / 0.964 |
| right | 1.68 | 0.857 / 1.059 | 0.960 / 0.955 |
縦勾配(top/bot ≈ 0.85/1.06)が 3 灯ほぼ同一.3 単灯どうしの形の一致度:
| ペア | NCC | SSIM |
|---|---|---|
| bottom vs left | 0.924 | 0.401 |
| bottom vs right | 0.927 | 0.406 |
| left vs right | 0.913 | 0.360 |
→ NCC ≈ 0.92 で 3 灯は互いにかなり似た形.違いは「自分の側がほんの少し明るい」弱い横バイアスのみ.
重要な含意: TEST_04(実機単灯比較) では実機の 3 灯は相補的に異なる方向を照らす(下=上側/左=右寄り…)とされていた.しかし修正後シミュは 3 灯ほぼ同じ形=実機の「相補性」を再現できていない.これは「シミュでは形が筐体で決まり LED 位置の効きが弱すぎる」ことを意味し,(a) 筐体幾何 B1 の不正確さ,または (b) シミュが間接化しすぎ(実機は各灯の直接性/指向性がもっと残る)を示唆する.実験3(幾何)の追加手がかり.
lightsim/luminance_maps/bottom_*.npy(単灯実測,.gitignore 対象)