本ドキュメントは,TEST_08 面光源スケール軸バグ の修正後もなお残る**「照明分布の“形”が実機と一致しない」問題**について,原因を実験で切り分けていく継続記録である.
最優先の判定基準: 本調査は CoV/勾配などの**数値の絶対量ではなく,実機マップとの「形の一致」**を唯一の判定基準とする.形が一致しない限り「筐体を仮想的に変えて結果を予測する」というツール本来の目的(筐体改善の事前検討)が成立しないため.判定には実機マップを参照とした NCC/SSIM + 視覚比較 + 放射プロファイルを用い,peak/mean(中心の尖り具合)を補助指標とする.
【重要・ROI 揃え更新】 本ドキュメントの数値・図は シミュを公式 ROI(
evaluation.roi_presets.SIM_ROI= image_pixel(24,37,464,450))で切り出し,実機 ROI(REAL_ROI,実機 npy は適用済み)と物理領域を揃えて算出した版に更新済み.初期検証はシミュをフル 512² フレームのまま測っており(板の縁・周辺暗部を含む),peak/mean を ~0.07 過大・NCC を ~0.05 過小に見せていた.ROI 揃えで NCC は +0.05 程度改善するが,結論(混ぜ具合・配光は本筋でない/形は実機に届かない/B1 幾何が最有力)は不変.ROI 版の図はoutput/_slide_panels/*_roi.png.
TEST_08 の面光源バグ修正で灯間バランス(下灯 2.1×)は解消したが,各単灯・合成の分布の形は実機と一致しないまま:
比較図: output/_slide_panels/sim_vs_real_shape_roi.png / sim_vs_real_colormap_roi.png(ROI 揃え)
実機ハードの確認結果(ユーザー回答):
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_roi.png(ROI 揃え)(数値は ROI 揃え版.図 output/_slide_panels/depth_bottom_shape_roi.png)
| max_depth | mean(参考,フル) | peak/mean(ROI) | NCC(ROI,対実機) |
|---|---|---|---|
| 1 | 0.000(真っ暗) | – | – |
| 2 | 0.000(真っ暗) | – | – |
| 4 | 1.474 | 2.073 | 0.731 |
| 8 | 3.484 | 1.730 | 0.735 |
| 16 | 4.678 | 1.585 | 0.720 |
| 32 | 4.904 | 1.591 | 0.717 |
| 実機 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_roi.png(ROI 版)| R (printer_white) | peak/mean(ROI) | top/bot(ROI) | NCC(ROI,対実機) |
|---|---|---|---|
| 0.85 | 1.585 | 0.879 | 0.720 |
| 0.90 | 1.541 | 0.890 | 0.714 |
| 0.95 | 1.408 | 0.901 | 0.708 |
| 0.98 | 1.392 | 0.908 | 0.701 |
| 実機 bottom | 1.218 | 0.931 | – |
LED の面積がバグ修正で正しくなったため,光源側の最後のレバー=**配光(指向性)**を再検証する(過去 Step 8-14 の ξ 実験はバグ込みのため無効).bottom 単灯・spp=1024・max_depth=16 固定で,Lambertian 面光源(現状)に対し spot emitter の cutoff_angle を {15,30,60,90,120,150}°(beam_width = cutoff/3)でスイープ.
configs/_tmp_distrib_bottom/c{015..150}.yaml(bottom 6 灯のみ,scene_baseline_spot.yaml ベース)output/distrib_bottom/c{NNN}/luminance.npy,基準 area は output/depth_bottom/d16output/_slide_panels/distrib_bottom_shape_roi.png(ROI 版)| 光源 | peak/mean(ROI) | top/bot(ROI) | NCC(ROI,対実機) |
|---|---|---|---|
| area(Lambertian, 現状) | 1.585 | 0.879 | 0.720 |
| spot 15° | 1.950 | 0.761 | 0.652 |
| spot 30° | 1.657 | 0.800 | 0.737 |
| spot 60° | 1.443 | 0.861 | 0.730 |
| spot 90° | 1.436 | 0.879 | 0.722 |
| spot 120° | 1.704 | 0.883 | 0.705 |
| spot 150° | 1.828 | 0.883 | 0.681 |
| 実機 bottom | 1.218 | 0.931 | – |
過去結論の訂正: PROGRESS の Step 8-14「area→spot は形改善の本物候補(angular_ratio −25%)」はバグ込み(2m ストリップ)の結論であり,正しい面積で再検証すると効果は誤差レベル(NCC 0.72→0.74).TEST_07 と同じく ξ も過大評価だった.
過去 Step 8-14 β の blend BSDF 実験(A1 非 Lambertian)は面光源バグ込み・3 灯フルシーン・絶対指標評価だったため,修正後 LED・TEST_09 の形指標で再検証する.検証仮説は 2 つ:
条件は実験1〜3 と同一(bottom 単灯・spp=1024・max_depth=16).printer_white を blendbsdf(diffuse 0.85 + roughconductor ggx)化し,w ∈ {0.05, 0.15, 0.3, 0.6} × α ∈ {0.1, 0.3, 0.6} の 12 ジョブ(旧グリッド+強光沢 w=0.6 行)をスイープ.
configs/_tmp_blend_bottom/w{W}_a{A}.yaml(_tmp_sanity_1024/scene_bottom.yaml ベース)output/blend_bottom/{job}/luminance.npy + summary.csvscripts/build_blend_bottom_panel.py,比較図 output/_slide_panels/blend_bottom_shape_roi.png(ROI 揃え)| 条件 | peak/mean(ROI) | top/bot(ROI) | NCC(ROI,対実機) |
|---|---|---|---|
| area diffuse(基準) | 1.585 | 0.879 | 0.721 |
| w0.05(3α 中最良) | 1.604 | 0.878 | 0.717 |
| w0.15(3α 中最良) | 1.691 | 0.876 | 0.711 |
| w0.3(3α 中最良) | 1.698 | 0.875 | 0.702 |
| w0.6(3α 中最良) | 1.736 | 0.879 | 0.669 |
| w0.6_a0.1(最悪) | 2.145 | 0.833 | 0.667 |
| 実機 bottom | 1.218 | 0.931 | – |
全 12 ジョブが純 diffuse より悪化し,w に対し単調悪化.光沢成分は評価板にホットスポットを作って尖りを増やし,NCC も下げる.α では鏡面寄り(α=0.1)が最も悪く,「鏡面ほど光源形状が焼き付く」の物理と整合.旧結論「A1 は形改善レバーでない」は正しい LED でも確定(ただし旧実験の根拠は無効で,本実験が正式な根拠).
最強光沢条件 w0.6_a0.1 で left / right 単灯も同条件レンダし,3 灯相互の形の一致度を比較(mean 正規化・フル frame,spp=1024):
| ペア | diffuse | blend w0.6_a0.1 | 実機 |
|---|---|---|---|
| bottom vs left | 0.961 | 0.862 | 0.853 |
| bottom vs right | 0.963 | 0.860 | 0.606 |
| left vs right | 0.956 | 0.856 | 0.414 |
※ diffuse の灯間 NCC は spp=1024 の output/sanity_fix_1024/ で 0.96(§追加観察の 0.92 は spp が低い led_group_sanity_fix 計測でノイズにより過小だった).実機の灯間 NCC を初めて定量化: 0.85 / 0.61 / 0.41 と強く非対称な相補性(特に left vs right はほぼ別物の分布)を持つ.
bottom の結論が灯に依存しないことを確認するため,left / right 単灯でも縮小グリッド
w ∈ {0.05, 0.3} × α ∈ {0.1, 0.6}(+Phase 2 の w0.6_a0.1)を同条件でスイープ
(configs/_tmp_blend_bottom/{left,right}_w*_a*.yaml,基準 diffuse は output/sanity_fix_1024/,
図 output/_slide_panels/blend_{left,right}_shape_roi.png,数値 output/blend_bottom/summary_{left,right}.csv):
| 条件 | left peak/mean | left NCC | right peak/mean | right NCC |
|---|---|---|---|---|
| area diffuse(基準) | 1.555 | 0.664 | 1.610 | 0.787 |
| w0.05(2α 中最良) | 1.579 | 0.664 | 1.546 | 0.789 |
| w0.3(2α 中最良) | 1.746 | 0.638 | 1.846 | 0.773 |
| w0.6_a0.1 | 2.025 | 0.565 | 2.198 | 0.702 |
| 実機 | 1.267 | – | 1.201 | – |
bottom と同じ「w 単調悪化」を 3 灯すべてで確認(w0.05 は誤差レベルで基準と同等,w0.3 以上で明確に悪化). また 3 灯揃った 5 つの材料条件で灯間 NCC(相補性)を比較すると:
| 条件 | b-l | b-r | l-r |
|---|---|---|---|
| diffuse | 0.961 | 0.963 | 0.956 |
| w0.05_a0.1 | 0.959 | 0.961 | 0.954 |
| w0.3_a0.1 | 0.919 | 0.921 | 0.911 |
| w0.6_a0.1 | 0.862 | 0.860 | 0.856 |
| 実機 | 0.853 | 0.606 | 0.414 |
灯間 NCC は w に対し滑らかに低下するが,どの条件でも 3 ペアが一様(差 < 0.01)で, 実機の非対称パターン(b-l だけ似ていて l-r はほぼ別物)にはどこまで行っても近づかない. 「材料の等方な変更では 3 ペアを一様にしか動かせない」ことがスイープ全域で裏付けられた.
実機の非対称な相補性(left vs right NCC 0.41)は,等方な材料変更では原理的に作れない.LED から評価板への光の経路そのものが灯ごとに異なる幾何(カバーの開口形状・仕切り・箱の閉じ方の非対称)でしか説明できず,B1 筐体幾何が最有力という実験1〜3 の結論を相補性の面からも強く裏付ける.実機灯間 NCC(0.85/0.61/0.41)は実験4 以降の幾何修正の到達目標として使える新しい定量アンカーである.
| レバー | 実験 | 形への効果(ROI) | 判定 |
|---|---|---|---|
| 反射回数 max_depth | 実験1 | d16 で頭打ち,peak/mean 1.59 止まり | 本筋でない |
| 反射率 R | 実験2 | R=0.98 でも 1.39 止まり,NCC 改善せず | 本筋でない |
| 配光 ξ(spot cutoff) | 実験3 | 中庸 spot で 1.44 止まり,NCC 横ばい | 本筋でない |
| 壁の光沢化(blend w×α) | 実験5 | 全 12 ジョブ悪化(w 単調).灯間 NCC 0.96→0.86 で機構は確認したが実機の非対称相補性(0.85/0.61/0.41)に届かず | 本筋でない |
| 筐体幾何 B1 | 実験4(予定) | — | 最有力(光源側・材料側レバー出尽くし) |
光源側(反射回数・反射率・配光)と材料側(反射率の大きさ・光沢の種類)のレバーを出し尽くしても形も相補性も実機に届かない=残るは筐体幾何のみ.
「光がどこから逃げているか/箱が閉じているか」を直接調べる:
実機マップは LSC 補正済み(dng_luminance(apply_lsc=True)).LSC はレンズ周辺減光を割り戻す処理で本来は照明分布を平らにしないはずだが,「実機の平らさが本物の照明分布か,処理由来か」を実験4 前に一度確認しておくと安全(TECH_07 LSC 取り扱い方針 参照).
なぜ光源の形(点 vs 2m 帯)を変えても板の形がほとんど変わらないのか(TEST_08 §修正前後のカラーマップ比較)の物理的根拠は,板が「間接光のみ(LED は板に背を向け,depth=1,2 が真っ暗)+ Lambertian 拡散壁」で照らされ,形が光源でなく筐体で決まるため.拡散壁での多重反射が光源の形状情報を洗い流す(積分球の原理;壁が鏡面なら光源形状が板に焼き付くが Lambertian なので消える).
この帰結として,修正後シミュでは下・左・右の 3 単灯の「形」が互いにほぼ同一になる(同じ筐体に光を注ぐため).3 単灯どうしの形の一致度(mean 正規化,フル frame 計測):
| ペア | 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 灯は互いにかなり似た形.違いは「自分の側がほんの少し明るい」弱い横バイアスのみ(縦勾配 top/bot ≈ 0.85/1.06 が 3 灯ほぼ同一).
重要な含意: TEST_04(実機単灯比較) では実機の 3 灯は相補的に異なる方向を照らす(下=上側/左=右寄り…)とされていた.しかし修正後シミュは 3 灯ほぼ同じ形=実機の「相補性」を再現できていない.これは「シミュでは形が筐体で決まり LED 位置の効きが弱すぎる」ことを意味し,(a) 筐体幾何 B1 の不正確さ,または (b) シミュが間接化しすぎ(実機は各灯の直接性/指向性がもっと残る)を示唆する.実験4(幾何)の追加手がかり.
※ 上記の灯間 NCC≈0.92 は spp が低い計測でノイズにより過小だった(spp=1024 では 0.96).(b) の仮説「壁の光沢化で指向性を戻す」は実験5 で検証済み=機構は働くが実機の非対称相補性(0.85/0.61/0.41)には届かず,形も悪化するため不採用.
lightsim/luminance_maps/bottom_*.npy(単灯実測,.gitignore 対象)