# 照明分布の形不一致の原因切り分け (Shape Mismatch Root-Cause Investigation)

本ドキュメントは，[TEST_08 面光源スケール軸バグ](TEST_08_面光源スケール軸バグの発見と修正.md) の修正後もなお残る**「照明分布の“形”が実機と一致しない」問題**について，原因を実験で切り分けていく継続記録である．

> **最優先の判定基準**: 本調査は CoV／勾配などの**数値の絶対量ではなく，実機マップとの「形の一致」**を唯一の判定基準とする．形が一致しない限り「筐体を仮想的に変えて結果を予測する」というツール本来の目的（筐体改善の事前検討）が成立しないため．判定には実機マップを参照とした **NCC／SSIM ＋ 視覚比較 ＋ 放射プロファイル**を用い，peak/mean（中心の尖り具合）を補助指標とする．

## 出発点 — バグ修正後も「形」は不一致

TEST_08 の面光源バグ修正で**灯間バランス（下灯 2.1×）は解消**したが，各単灯・合成の**分布の形**は実機と一致しないまま：

- **実機 単灯**: ほぼ一様（peak/mean ≈ 1.2，放射プロファイルは中心 1.05 → 周辺 0.9 でほぼ平坦）
- **シミュ 単灯**: 中心が尖り（peak/mean ≈ 1.7）＋上暗下明の縦勾配，周辺の落ち込みが急

比較図: `output/_slide_panels/sim_vs_real_shape_fixed.png` / `sim_vs_real_colormap_fixed.png`

## 重要な前提確認 — ディフューザーは存在しない

実機ハードの確認結果（ユーザー回答）：

- **LED カバー（`LED基板カバー*.stl`）は筐体と同じ不透明白材**（3D プリンタ白フィラメント，printer_white）．光は透過しない．
- **LED とは別のディフューザー（すりガラス・乳白アクリル・拡散シート等）は一切挟んでいない**．
- → 実機は **むき出し LED ＋ 白い筐体のみ**．

含意：**実機単灯のあの「平らさ」を作っているのは光学部品ではなく，白い筐体内の多重反射（積分球的な拡散）**でしかありえない．逆に言えば，形を再現する鍵は新部品ではなく**筐体（反射＋幾何）の正しいモデル化**にある．

## 重要な注意 — 過去の「形は変わらない」結論はバグ込み

[PROGRESS](../PROGRESS.md) に記録された「**A8 反射率・A9 max_depth・A1 BSDF を振っても形は変わらない**」という Step 8-14 の結論は，**すべて面光源バグ（2m 縦長ストリップ）が入った状態で得たもの**であり，TEST_07 と同様に**再検証が必要**．特に「筐体が光をかき混ぜて平らにする」効果は反射回数・反射率に依存するはずで，バグで巨大ストリップが支配していたため形が動かなかった可能性がある．本調査は**修正後の正しい LED で**やり直す．

## 実験1 — bottom 単灯 max_depth バウンス分解（spp=1024）

### 目的・条件

「形を平らにするレバーが現エミッタで存在するか」を確かめる第一歩．**bottom 単灯のみ・spp=1024 固定**で，**max_depth 以外をすべて一定**にし，反射回数を `{1, 2, 4, 8, 16, 32}` で振る．「バウンスを増やすほど実機の平らな形に近づくか／頭打ちか」を見る．

- config: `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.npy`
- 比較図: `output/_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. **depth=1, 2 が完全に真っ暗（mean=0）** → LED は板に背を向けており（emitter 法線 -Z，板は +Z 側），**板は完全に間接光のみ**で照らされる（3〜4 回反射してようやく到達）．TEST_08 で示した「LED は板と反対を向き間接光で照らす」を実証．
2. **バウンスを増やすと多少は平らになる**（peak/mean 2.22 → 1.65）が，**depth=16 で完全に頭打ち**（d16 と d32 がほぼ同一：1.653 vs 1.657，NCC 0.670 vs 0.666）．
3. しかし**頭打ちの到達点（peak/mean 1.65）が実機（1.22）に全く届かない**．NCC も 0.67 で頭打ち（むしろ深さとともに微減）．上暗下明の縦勾配も最後まで消えない．

### 解釈

- **「混ざり不足（バウンス不足）」は原因ではない**．反射を理論上限（d32）まで積んでもシミュは尖ったまま．
- **完全に閉じた白い箱なら，無限反射で必ず均一（積分球）になる**はず．シミュが d32 でも尖り＋縦勾配を残す＝**光が箱内で混ざりきる前にどこかへ逃げている**＝**シミュ筐体が実機ほど閉じていない（壁の欠け・隙間・開口）**疑いが濃厚．
- → 形の残差の本筋は **B1 筐体幾何**側にある可能性が高い，と実験で絞り込めた（反射回数では詰められない）．

## 実験2 — bottom 単灯 反射率スイープ（spp=1024, d=16）

### 目的・条件

実験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) は据え置き．

- config: `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.npy`
- 比較図: `output/_slide_panels/refl_bottom_shape.png`
- 判定: 閉じた箱なら R↑で一気に平ら（実機方向）→ 反射率の問題／漏れた箱なら R↑でも尖ったまま → 幾何（閉じ漏れ）が確定

### 結果

| 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** | – | – |

### 読み取れること

1. **R を上げると確かに少し平らになる**（peak/mean 1.65→1.44，縦勾配 top/bot 0.867→0.894 で実機方向）．
2. **しかし R=0.98（3D プリンタ白では非現実的に高い値）でも peak/mean 1.44 止まりで，実機 1.22 に届かない**．
3. **肝心の形の一致度（NCC）は改善しない**（0.670→0.640 でむしろ微減）．SSIM もほぼ横ばい（0.40→0.42）．

### 解釈

- **反射率も「形の本筋」ではない**．実験1（バウンス回数）と実験2（反射率）で，**「筐体が光をかき混ぜる強さ」を司る 2 つのレバーを両方とも上限まで振っても，シミュは実機の平らさに構造的に届かない**ことが確定．NCC が頭打ち＝形の不一致は混ぜ具合では埋まらない．
- 反射率を上げても recirculation が効ききらない＝**箱が閉じておらず光が逃げている**疑いが，実験1（無限バウンスでも尖り＋縦勾配が残る）と整合して裏付けられた．
- → **形の残差の本筋は B1 筐体幾何（光の入り方・箱の閉じ方）に絞り込まれた**．

## 2 実験の総括と次の予定

| レバー | 実験 | 形への効果 | 判定 |
| --- | --- | --- | --- |
| 反射回数 max_depth | 実験1 | d16 で頭打ち，peak/mean 1.65 止まり | 本筋でない |
| 反射率 R | 実験2 | R=0.98 でも 1.44 止まり，NCC 改善せず | 本筋でない |
| **筐体幾何 B1** | 実験3（予定） | — | **最有力** |

### 次（実験3）— 幾何の漏れ点検

「光がどこから逃げているか／箱が閉じているか」を直接調べる：

- **漏れの定量化**: bottom 単灯で，放出フラックスのうち何割が評価板に届き，何割が開口から外へ逃げているかを測る
- **閉じテスト**: シミュ筐体の開いている面（センサ側開口など）を仮の白壁で塞いで再レンダ → 平らになれば「閉じ漏れ」が原因と確定

### 補足 — 実機の平らさの素性確認（実験3 前に要検討）

実機マップは **LSC 補正済み**（`dng_luminance(apply_lsc=True)`）．LSC はレンズ周辺減光を割り戻す処理で**本来は照明分布を平らにしない**はずだが，「実機の平らさが本物の照明分布か，処理由来か」を実験3 前に一度確認しておくと安全（[TECH_07 LSC 取り扱い方針](../05_TECH/TECH_07_LSC取り扱い方針.md) 参照）．

## 関連ドキュメント

- [TEST_08 面光源スケール軸バグの発見と修正](TEST_08_面光源スケール軸バグの発見と修正.md) — 本調査の前提（バグ修正で灯間バランスは解決済み）
- [TEST_07 LED グループ別動作確認](TEST_07_LEDグループ別動作確認.md) — バグ込みの旧結論（訂正済み）
- 実機入力: `lightsim/luminance_maps/bottom_*.npy`（単灯実測，`.gitignore` 対象）
