diff --git "a/configs/meshes/\345\276\214\345\201\264_w2p0.stl" "b/configs/meshes/\345\276\214\345\201\264_w2p0.stl" new file mode 100644 index 0000000..28cd55f --- /dev/null +++ "b/configs/meshes/\345\276\214\345\201\264_w2p0.stl" Binary files differ diff --git "a/configs/meshes/\345\276\214\345\201\264_w4p0.stl" "b/configs/meshes/\345\276\214\345\201\264_w4p0.stl" new file mode 100644 index 0000000..3e75cb4 --- /dev/null +++ "b/configs/meshes/\345\276\214\345\201\264_w4p0.stl" Binary files differ 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 7cfa9ef..4277fb8 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" @@ -61,6 +61,9 @@ | `output/loft_w1p4/{bottom,left,right,full,full_base}/` (5 ディレクトリ) | TEST_10 | `configs/_tmp_loft_w1p4/{bottom,left,right,full,full_base}.yaml`(blend w0.05_a0.1・spp=1024・d=16.単灯 3 本+全灯は後側を `後側_w1p4.stl` に差し替え,full_base のみ元 `後側.stl` の全灯 blend 基準) | full 系は `configs/eval_baseline_dng_target_shape.yaml` | bottom 単灯 peak/mean 1.672→1.508 と初の幾何レバー実証.灯間 NCC は 0.95x→0.96x で相補性不動.全灯 CoV 0.1717→0.1701 — [TEST_10](TEST_10_後側ロフト変形w1p4実験.md) 参照 | TEST_10 後側ロフト変形実験.対称な幾何変更では非対称相補性は動かないことを確定 | | `output/loft_w1p4/summary.csv` | TEST_10 | — | — | 単灯 3+全灯 2 の形指標集約 (side, version, peak_mean, top_bot, ncc_vs_real) | TEST_10 数値追跡用 | | `output/_slide_panels/loft_w1p4_shape_roi.png` | TEST_10 | — | — | 基準・w1p4・実機の 4 行 × 3 列形比較パネル(ROI 揃え・各セル独立 1–99% 正規化) | TEST_10 視覚比較用 | +| `output/loft_w1p4/full_{w2p0,w4p0}/` (2 ディレクトリ) | TEST_10 拡張 | `configs/_tmp_loft_w1p4/{w2p0,w4p0}_full.yaml`(full.yaml の後側を `後側_{w2p0,w4p0}.stl` に差し替え) | `configs/eval_baseline_dng_target_shape.yaml` | ロフト重み 0.5→4.0 で全灯指標は横ばい(w4.0 のみ微悪化 CoV 0.1772)— [TEST_10 §拡張](TEST_10_後側ロフト変形w1p4実験.md) 参照 | TEST_10 全灯ロフト重みスイープ.ロフトは全灯分布に実質不感と確定 | +| `output/_slide_panels/loft_full_sweep_shape_roi.png` | TEST_10 拡張 | — | — | 全灯 w0.5/1.4/2.0/4.0 + 実機の 1×5 形比較パネル | TEST_10 拡張視覚比較用(`scripts/build_loft_w1p4_panel.py` が summary.csv とあわせて生成) | +| `output/_slide_panels/loft_full_sweep_relative.png` | TEST_10 拡張 | — | — | 同スイープの相対輝度版(シミュ 4 条件のみ 1×4・各セル max=1.0・全セル共通スケール・右カラーバー) | 均一性の絶対比較用.mean/max 0.64〜0.67 で横ばい(実機参照値 0.899 は TEST_10 の表を参照) | ### sweep_summary.csv の値(参考、TEST_01 line と一致確認用) @@ -105,6 +108,7 @@ | blend 単灯スイープ (TEST_09 実験5) | `configs/_tmp_blend_bottom/` の各 YAML を `uv run sm-render --scene configs/_tmp_blend_bottom/{job}.yaml --output output/blend_bottom/{job}` で順次実行 (1 ジョブ約 10.5 分) | | blend 単灯の形指標解析・パネル生成 | `uv run python scripts/build_blend_bottom_panel.py --side {bottom,left,right}` (要 `output/blend_bottom/` の各 `luminance.npy` + 実機 `lightsim/luminance_maps/*.npy`) | | loft_w1p4 レンダ (TEST_10) | `$env:DRJIT_LIBLLVM_PATH = "C:\Program Files\LLVM\bin\LLVM-C.dll"; uv run sm-render --scene configs/_tmp_loft_w1p4/{job}.yaml --output output/loft_w1p4/{job}/` (job ∈ {bottom, left, right, full, full_base}.単灯 約 10 分・全灯 約 10 分/本) | +| loft 重みスイープ レンダ (TEST_10 拡張) | `$env:DRJIT_LIBLLVM_PATH = "C:\Program Files\LLVM\bin\LLVM-C.dll"; uv run sm-render --scene configs/_tmp_loft_w1p4/{w2p0,w4p0}_full.yaml --output output/loft_w1p4/full_{w2p0,w4p0}/` | | loft_w1p4 全灯評価 (TEST_10) | `uv run sm-evaluate --image output/loft_w1p4/{full,full_base}/luminance.npy --config configs/eval_baseline_dng_target_shape.yaml --output output/loft_w1p4/{full,full_base}/` | | loft_w1p4 形指標解析・パネル生成 (TEST_10) | `uv run python scripts/build_loft_w1p4_panel.py` (要 `output/loft_w1p4/` と元メッシュ基準 `output/blend_bottom/` の各 `luminance.npy` + 実機 `lightsim/luminance_maps/*.npy`.summary.csv と 4×3 パネルを再生成) | diff --git "a/docs/06_TEST/TEST_10_\345\276\214\345\201\264\343\203\255\343\203\225\343\203\210\345\244\211\345\275\242w1p4\345\256\237\351\250\223.md" "b/docs/06_TEST/TEST_10_\345\276\214\345\201\264\343\203\255\343\203\225\343\203\210\345\244\211\345\275\242w1p4\345\256\237\351\250\223.md" index 029adf2..dc83318 100644 --- "a/docs/06_TEST/TEST_10_\345\276\214\345\201\264\343\203\255\343\203\225\343\203\210\345\244\211\345\275\242w1p4\345\256\237\351\250\223.md" +++ "b/docs/06_TEST/TEST_10_\345\276\214\345\201\264\343\203\255\343\203\225\343\203\210\345\244\211\345\275\242w1p4\345\256\237\351\250\223.md" @@ -110,6 +110,37 @@ 3. **相補性(灯間 NCC)は全く動かず**(0.95x → 0.96x でむしろ微増=さらに同形化).対称なキャビティ拡大は「混ぜる力」を強めるだけで,実機の非対称相補性(0.85/0.61/0.41)には近づかない. 4. 全灯の均一性指標はほぼ不変(CoV -0.9%,NCC 対実機 0.744→0.737)=このロフト変形は**全灯運用での均一性・形をほぼ変えない**.実機全灯(peak/mean 1.155・CoV 0.0695)との差は依然大きい. +### 拡張 — 全灯ロフト重みスイープ(w=2.0, 4.0 追加) + +w=1.4 に加えユーザーがロフトパラメータ 2.0 / 4.0 版を作成(`後側_{w2p0,w4p0}.stl`)し,全灯のみ同条件でスイープを拡張した(2026-07-28).メッシュ事実: + +- `後側_w2p0.stl`: 体積 +13.5%・最大偏差 20 mm・外形 bounds は元と同一.watertight +- `後側_w4p0.stl`: 体積 +65.9%・最大偏差 61 mm.**Z 下方向に 43 mm はみ出し(Z=-150 → -192.8)てスマホ面(Z=-154.4)を越える**=シミュ上はスマホ・ホルダのメッシュと交差した状態(レンダは正常動作).watertight + +| ロフト重み | CoV | peak/mean (ROI) | top/bot (ROI) | NCC 対実機 (ROI) | +| --- | --- | --- | --- | --- | +| 0.5(元) | 0.1717 | 1.491 | 0.878 | 0.744 | +| 1.4 | 0.1701 | 1.486 | 0.885 | 0.737 | +| 2.0 | 0.1709 | 1.502 | 0.884 | 0.737 | +| 4.0 | 0.1772 | 1.558 | 0.867 | 0.747 | +| **実機(w0.5)** | **0.0695** | **1.155** | **0.919** | 1.0 | + +比較図: `output/_slide_panels/loft_full_sweep_shape_roi.png`(config: `configs/_tmp_loft_w1p4/{w2p0,w4p0}_full.yaml`,出力: `output/loft_w1p4/full_{w2p0,w4p0}/`). + +均一性の絶対比較用に,**各マップの最大値を 1.0 とした相対輝度・全セル共通スケール**版も生成した(`output/_slide_panels/loft_full_sweep_relative.png`.シミュ 4 条件のみの 1×4 +右カラーバー構成.完全均一なら全面 1.0.max はシミュ MC ノイズの外れ画素対策として共通解像度への resize 後に取る): + +| ロフト重み | mean/max | min/max | +| --- | --- | --- | +| 0.5(元) | 0.671 | 0.241 | +| 1.4 | 0.673 | 0.229 | +| 2.0 | 0.666 | 0.238 | +| 4.0 | 0.642 | 0.216 | +| **実機(w0.5)** | **0.899** | **0.660** | + +相対輝度で見てもシミュ 4 条件は mean/max 0.64〜0.67 で横ばい(w4.0 のみ微悪化)であり,実機の 0.899 との差が均一性の残差として一目で分かる. + +読み取り: **ロフト重みは 0.5→4.0(体積 +66%・壁の張り出し 61 mm)まで振っても全灯の分布をほぼ動かさない**.全指標が誤差レベルで横ばいし,最大の w=4.0 でわずかに悪化(CoV +3%・peak/mean +4%)するのみ.単灯 bottom で見えた平ら化(1.672→1.508)も全灯合成では 3 灯の寄与が混ざって消える.**ロフト(フレア部の対称な膨らみ)は全灯運用の均一性・形に対して実質的に不感なパラメータ**であり,実機側でこの部位を変えても撮影結果はほぼ変わらないという予測になる(w=1.4 実機測定 `MiniTIAS_QM_20260726_183416` の検証ポイント). + ### 解釈と次への示唆 - ロフト重み(対称なフレア拡大)は「bottom の平ら化」には効くが,**形の残差の本丸(非対称相補性)を動かすレバーではない**.TEST_09 実験5 の結論「等方な変更では 3 ペアを一様にしか動かせない」は,**等方な材料変更だけでなく対称な幾何変更にも当てはまる**ことが示された. diff --git a/scripts/build_loft_w1p4_panel.py b/scripts/build_loft_w1p4_panel.py index 20ed111..f36d3fb 100644 --- a/scripts/build_loft_w1p4_panel.py +++ b/scripts/build_loft_w1p4_panel.py @@ -58,6 +58,16 @@ VERSIONS = ["base", "w1p4", "real"] VERSION_LABELS = {"base": "元メッシュ基準", "w1p4": "後側_w1p4", "real": "実機"} +# 全灯ロフト重みスイープ(w2p0/w4p0 拡張分.ラベル → luminance.npy のディレクトリ) +FULL_SWEEP = [ + ("w0.5(元)", ROOT / "output" / "loft_w1p4" / "full_base"), + ("w1.4", ROOT / "output" / "loft_w1p4" / "full"), + ("w2.0", ROOT / "output" / "loft_w1p4" / "full_w2p0"), + ("w4.0", ROOT / "output" / "loft_w1p4" / "full_w4p0"), +] +SWEEP_PANEL_PATH = ROOT / "output" / "_slide_panels" / "loft_full_sweep_shape_roi.png" +SWEEP_REL_PANEL_PATH = ROOT / "output" / "_slide_panels" / "loft_full_sweep_relative.png" + # 全セルの共通描画解像度(シミュ ROI と同程度.実機はダウンサンプル) CELL_SHAPE = (450, 464) VMIN_PERCENTILE = 1.0 @@ -115,6 +125,23 @@ rm = _metrics(real, real) rows.append([side, "real", f"{rm['peak_mean']:.4f}", f"{rm['top_bot']:.4f}", "1.0000"]) + # 全灯ロフト重みスイープ(w2p0/w4p0 は 4×3 パネル外のため summary にのみ追記) + real_full = _load_luminance(REAL["full"]) + sweep_cells: list[tuple[str, np.ndarray, dict[str, float]]] = [] + for label, job_dir in FULL_SWEEP: + npy = job_dir / "luminance.npy" + if not npy.exists(): + print(f" 警告: {npy} 未完了(sweep パネルからスキップ)") + continue + roi = extract_roi_xywh(_load_luminance(npy), SIM_ROI) + m = _metrics(roi, real_full) + sweep_cells.append((label, roi, m)) + if label.startswith(("w2.0", "w4.0")): + rows.append( + ["full", label, f"{m['peak_mean']:.4f}", f"{m['top_bot']:.4f}", f"{m['ncc']:.4f}"] + ) + sweep_cells.append(("実機(w0.5)", real_full, _metrics(real_full, real_full))) + SUMMARY_CSV.parent.mkdir(parents=True, exist_ok=True) with SUMMARY_CSV.open("w", encoding="utf-8", newline="") as f: writer = csv.writer(f) @@ -184,6 +211,65 @@ fig.savefig(PANEL_PATH, dpi=150, bbox_inches="tight") plt.close(fig) print(f"パネル保存: {PANEL_PATH}") + + # 全灯ロフト重みスイープの 1×N パネル + n = len(sweep_cells) + fig2, axes2 = plt.subplots(1, n, figsize=(n * 4.2, 4.6), constrained_layout=True) + for ax, (label, img, m) in zip(axes2, sweep_cells, strict=True): + disp = resize(img / img.mean(), CELL_SHAPE, anti_aliasing=True) + ax.imshow( + disp, + cmap="hot", + vmin=float(np.percentile(disp, VMIN_PERCENTILE)), + vmax=float(np.percentile(disp, VMAX_PERCENTILE)), + aspect="equal", + ) + ax.set_title( + f"{label}\np/m={m['peak_mean']:.3f} t/b={m['top_bot']:.3f} NCC={m['ncc']:.3f}", + fontsize=10, + pad=6, + ) + ax.set_axis_off() + fig2.suptitle( + "TEST_10 拡張 — 全灯ロフト重みスイープ(blend w0.05_a0.1, spp=1024, d=16, ROI 揃え)\n" + "各セル独立 1–99% 正規化(形の比較専用)・全セル共通解像度", + fontsize=12, + ) + fig2.savefig(SWEEP_PANEL_PATH, dpi=150, bbox_inches="tight") + plt.close(fig2) + print(f"パネル保存: {SWEEP_PANEL_PATH}") + + # 相対輝度(各マップの max=1.0)版スイープパネル.全セル共通スケールで + # 「全体がどれだけ 1 に近いか=均一性の絶対比較」を可能にする. + # max はシミュ MC ノイズの外れ画素に引きずられないよう resize 後(共通解像度・ + # 実機相当に平滑化された状態)の最大値を用いる. + rel_cells = [] + for label, img, _ in sweep_cells: + if label.startswith("実機"): + continue + disp = resize(img.astype(np.float64), CELL_SHAPE, anti_aliasing=True) + rel = disp / disp.max() + rel_cells.append((label, rel)) + vmin = min(float(r.min()) for _, r in rel_cells) + n_rel = len(rel_cells) + fig3, axes3 = plt.subplots(1, n_rel, figsize=(n_rel * 4.4, 5.0), constrained_layout=True) + for ax, (label, rel) in zip(axes3, rel_cells, strict=True): + im = ax.imshow(rel, cmap="hot", vmin=vmin, vmax=1.0, aspect="equal") + ax.set_title( + f"{label}\nmean/max={rel.mean():.3f} min/max={rel.min():.3f}", + fontsize=10, + pad=6, + ) + ax.set_axis_off() + fig3.colorbar(im, ax=axes3, shrink=0.85, label="相対輝度(max=1.0)") + fig3.suptitle( + "TEST_10 拡張 — 全灯ロフト重みスイープ・相対輝度(各セル max=1.0,全セル共通スケール)\n" + "完全均一なら全面 1.0.mean/max・min/max が 1 に近いほど均一", + fontsize=12, + ) + fig3.savefig(SWEEP_REL_PANEL_PATH, dpi=150, bbox_inches="tight") + plt.close(fig3) + print(f"パネル保存: {SWEEP_REL_PANEL_PATH}") return 0