Newer
Older
SmTIAS-LightSim / docs / 06_TEST / TEST_15_バッフル導入と球半径スイープ.md

バッフル導入と球半径スイープ (Baffle Introduction and Sphere Radius Sweep)

球体筐体について,LED を評価板の反対側の壁面に密着させて評価板へ向け,直前のバッフルで 直接光を遮る構成を新設し,その上で球内半径を 88〜250mm でスイープした(2026-08-31). 均一性は同じ半径なら大きく改善したが,球を大きくすると悪化するという想定と逆の結果が出た. 原因をロフト接合の幾何に特定し,接合を作り直したところ傾向が逆転した.

関連:

背景・動機 (Motivation)

TEST_14 で内壁材質は確定し,形は材質パラメータでは動かないことが網羅探索で示された. 残る手段は幾何のレバーである.そこで 2 つの問いを立てた.

  1. キャビティを大きくすれば理想積分球(開口比ゼロ)に近づいて均一になるか
  2. TEST_11 が残差の物理源と特定した「未混合の一次照射成分」をバッフルで除去できるか

TEST_11 の記述によれば,R=0.85 の有限反射率では一次照射キャップ(LED が直接照らす壁面)が 消えず,評価板の各点がそれを異なる見込み角で見るため cos 依存のドーム状落ち込みが残る. バッフルで評価板から光源を隠せば,板には 2 回以上反射した光だけが届く.

実験条件 (Setup)

材質・センサ・レンダ設定・LED の面積と radiance は TEST_11 / TEST_12 から一切変更していない. 変えたのは LED の向き・位置とバッフルの有無,および筐体の幾何だけである.

項目値
レンダspp=1024 / max_depth=16 / 512² / llvm_ad_rgb / path / orthographic (50×52)
内壁材質blendbsdf ρ=0.85 / ω=0.05 / α=0.1(TEST_14 の校正値 ρ≈0.81 ではなく既存条件)
光源軸上の円板 半径 1.7662mm(面積 9.8mm² 保存)・radiance 2807.25
評価configs/eval_baseline_dng_target_shape.yaml(linear + mean アンカー 207.82)
評価板99×102mm.全条件で不変(キャビティ側の面は z=−4.5mm)

LED 構成 (LED Configuration)

構成LED の位置と向きバッフル
axial_wall(従来)−Z 極から 50mm 手前・壁向き (0,0,−1)なし(板は発光面の裏側なので直接光ゼロ)
board_baffle(新規)−Z 極の壁面に密着・評価板向き (0,0,+1)あり

壁面には 0.5mm だけ浮かせている.厳密に 0 にすると平らな発光円板が湾曲した壁面を貫くためで, 円板半径 1.7662mm でのサジッタは r=88 でも 0.018mm なので実質的に密着である. 極の壁面法線は +Z =評価板向きなので,「壁に付ける」と「評価板を向く」が同時に成り立つ.

バッフルの寸法 (Baffle Sizing)

LED から BAFFLE_GAP=10mm 手前に置く円板とし,半径は評価板の全点から LED を隠す最小値に 安全率 1.05 を掛けた.LED 上の点 Q と板上の点 P の内分点として閉形式で決まる.

R \ge (1 - f)\,r_\text{LED} + f\,r_\text{corner}, \quad f = \frac{\text{gap}}{z_\text{board} - z_\text{LED}}

半径が大きいほど LED が板から遠ざかり見込み角が小さくなるため,バッフルも小さくて済む (R = 6.9mm @ r=88 → 3.3mm @ r=250).厚み 1mm,材質は内壁と同一とした.

遮蔽は指標ではなくレイキャストで直接検証した(scripts/verify_baffle_occlusion.py). 評価板の全面 41×41 点 × LED 上 33 点 = 55,473 本のレイを飛ばし,全条件で 100% が LED 到達前に 遮蔽されることを確認している.

幾何のパラメータ化 (Cavity Parameterization)

半径を変えるときのキャビティ形状の決め方を 2 通り用意した.どちらも r=100 では既存 configs/scene_sphere_r100_loft_disk.yaml の球中心・接続円と一致する.

形状定義ロフト
fixed_cut接続円(85.417mm @ z=−40)を固定し球中心だけ動かす3 次 Hermite(接線のみ一致)
similar_g2キャビティ全体を半径に相似(center_z=−0.92r,cut_z=−0.40r)5 次 Hermite(接線 + 曲率を一致)

結果 1 — バッフル構成は不均一性を半減させる (Baffle Halves Non-uniformity)

同じ r=100・同じ fixed_cut 幾何で,LED 構成だけを比べる.

構成構造 CoVMC ノイズ輪帯 min/max中心/周辺比上下比
旧 axial_wall(バッフルなし)0.05790.02130.79671.1291.0067
新 board_baffle0.03120.06640.86101.0851.0028

構造成分は 46% 減,輪帯 min/max は 0.797 → 0.861 に改善した.中心のピークが下がり (1.10 → 1.085)周辺の落ち込みが浅くなる(0.86 → 0.93),つまりドーム全体が浅くなっている. 旧構成にあった上下の傾きも消えて完全な軸対称になった.

引き換えに MC ノイズは 3 倍に増えた.板へ届く光が全て多重反射経由になり,NEE が効かなくなる ためと考えられる.絶対量の比較には spp を増やす必要がある(下記「限界」参照).

結果 2 — CoV は MC ノイズに支配され,そのままでは読めない (CoV Is Noise-dominated)

本スイープは絶対輝度が半径で 1 桁変わる(生 mean 1.32 @ r=88 → 0.155 @ r=250,ほぼ 1/r²). spp を据え置いたため相対ノイズが半径とともに増え,metrics.csv の CoV は 0.069 → 0.128 と単調悪化するが,その大半はノイズである.

構造とノイズの分離は次の手順で行う(scripts/build_radius_sweep_visual.py:decompose_cov).

  1. σ=12 のガウシアン(+ median 5px)で平滑化した像の CoV を取る
  2. 残差(生 − 平滑)を空間シャッフルして同じ平滑化を掛け,ノイズの漏れ込み量を実測する
  3. 平滑後 CoV から漏れ込みを二乗で差し引く

妥当性は 2 通りで確認した.平滑化を σ=4→20 と変えても構造値は 4% しか動かず(収束), 漏れ込みは σ=12 で 0.0017〜0.0026 に留まる.

形の比較には同心円(輪帯)プロファイルを使うのが最も確実である. 方位平均はリング内の 画素数だけノイズを 1/√N に落とすため,標準誤差は中央値 0.0009〜0.0016 まで下がり, 条件間の差(0.02〜0.12)の 1/20〜1/100 になる.ノイズ水準の違う条件どうしを公平に比較できる.

結果 3 — fixed_cut では球を大きくすると悪化する (Bigger Is Worse in fixed_cut)

board_baffle × fixed_cut の 10 条件.内側 = ピーク→d=0.5,外側 = d=0.5→0.95 の落ち込み.

r mm生 CoVノイズ構造 CoV輪帯 min/max内側外側生 mean
880.06940.06400.02320.89515.11%5.59%1.322
950.07400.06540.03160.85718.11%6.39%1.091
1000.07470.06640.03120.86107.33%7.02%0.974
1100.07740.06980.03020.86766.81%7.17%0.798
1200.08010.07320.02890.87185.77%7.31%0.669
1350.08280.07670.02700.87265.57%8.08%0.530
1500.08780.08140.02800.86035.31%9.70%0.430
1700.09410.08740.03000.84384.59%12.08%0.336
2000.10460.09630.03610.81893.46%15.11%0.243
2500.12780.11640.04780.77913.51%17.97%0.155

輪帯 min/max は r=135 を境に単調悪化し,r=250 は旧 axial_wall 構成(0.797)より悪い.

内側と外側に分けると構造がはっきりする.内側は期待どおり単調に改善する (8.11% @ r=95 → 3.46% @ r=200)が,外側が同じ勢いで悪化して差し引きで負ける (6.39% → 17.97%).大半径では「中心はほぼ平ら,周辺だけ崖」という形になる.

この逆向きの動きから,律速はロフト斜面が作る「井戸」だという仮説を立てた.評価板は 深さ 35.5mm・口径 85.4mm の開口の底にあり,球はその口を通してしか見えない.中心画素は 開口をほぼ正面から見るので大きい球の恩恵をそのまま受け,周辺画素は開口に視野を切られる ため球を大きくしても届かない,という説明で内側・外側の両方が同時に説明できる.

結果 4 — 接合が半径とともに不自然になっていた (Junction Degrades with Radius)

fixed_cut は接続円を固定するため,半径を上げると接合点が球の頂点へ寄っていく.

r mm接合の傾き |dρ/dz|接合部の曲率比(ロフト/球)球の頂点 z mm
880.2489.30+26.8
1000.6094.95+8.0
1200.9871.80−4.3
1501.4440.11−13.3
1701.7210.68−17.0
2502.7511.34−25.0

r ≥ 120 では球の頂点が評価板より下にもぐる.つまりキャビティは「ほぼ閉じた玉に細い首が 生えた」形になり,板はその首の先から玉を覗く.接線は一致していても曲率は 9.30 → 0.11 → 1.34 と 暴れており,接合部に折れが残る.これが「井戸」の実体である.

結果 5 — 接合を直すと傾向が逆転する (Fixing the Junction Reverses the Trend)

similar_g2(キャビティ相似 + 5 次 G2 接合)では,接合の傾きは全半径で 0.609 一定, 曲率比は厳密に 1.00,球の頂点は常に板より上(z=+7〜+20mm)に留まる. どの半径でも「お椀にフタ」の自然な形になる.

r=100 / 170 / 250 の 3 条件で比較した.

r mm形状内側外側輪帯 min/max生 mean
100fixed_cut7.33%7.02%0.86100.974
100similar_g27.46%7.69%0.85200.973
170fixed_cut4.59%12.08%0.84380.336
170similar_g24.87%6.94%0.88310.355
250fixed_cut3.51%17.97%0.77910.155
250similar_g23.24%8.75%0.89110.166

外側の落ち込みが半分になった(r=250 で 17.97% → 8.75%).r=100 でほぼ変化がないのは 二つの設計がその半径でほぼ同形になるためで,整合性の確認になっている.

傾向が逆転した.輪帯 min/max は fixed_cut では半径とともに悪化(0.873 → 0.779)していたが, similar_g2 では改善する(0.852 → 0.883 → 0.891).r=250 の 0.891 はこれまで測った全条件で最良で, fixed_cut の最良(r=135 の 0.873)を上回る.

内側の落ち込みは両設計でほぼ同一(r=250 で 3.51% vs 3.24%)である.変更が予測どおり外側だけに 効いたことを意味し,「内側は球のサイズが支配し接合形状は無関係」という井戸仮説の構造と一致する.

副次的に明るさも改善した(r=250 で生 mean +7.1%).首が無くなったぶん光の閉じ込めが減ったと 考えられる.

結論 (Conclusions)

  • バッフル構成は有効.同じ r=100 で構造 CoV を 46% 減らし,上下の傾きも消える
  • キャビティサイズは,接合が自然であって初めて効くレバーになる.接続円を固定したまま球だけ 大きくすると,中心は平らになるが周辺が崖になり差し引きで悪化する
  • 接合はキャビティ全体を半径に相似させ,5 次 Hermite で曲率まで一致させるべき.これにより 半径を上げるほど均一になるという当初の想定どおりの挙動が得られる
  • 絶対輝度は 1/r² で落ちる(r=250 は r=88 の 1/8.5).実機では露光時間・ゲインに直結するので, 均一性の改善と天秤にかける必要がある

限界・注意点 (Limitations)

  • 全条件 1 シードのみ.ノイズフロア(seed 違い 2 本)は未測定.ただし輪帯プロファイルの 標準誤差は条件間の差の 1/20〜1/100 なので,本文の比較の結論は揺るがない
  • similar_g2 は 3 条件のみ.残り 7 半径(88 / 95 / 110 / 120 / 135 / 150 / 200)は未実行
  • r=88(fixed_cut)だけ突出して良い(輪帯 min/max 0.895)が,隣の r=95(0.857)と不連続で, 実体か揺らぎか未確定.r=88 は接続面が球中心のわずか 21mm 上で幾何が質的に違う
  • バッフル構成は MC ノイズが 3 倍になる.絶対量の比較や高精度な形の議論には spp を増やす必要がある
  • board_baffle は実機の LED 配置(下/左/右 3 基板)とは無関係な理想化である.実機との キャリブレーション(TEST_14 系)とは別系統の設計探索として扱うこと
  • 材質は TEST_14 の校正値(ρ≈0.81 純 diffuse)ではなく旧条件(ρ=0.85 blendbsdf)を使っている. TEST_11 / TEST_12 と直接比較するための選択であり,絶対値の実機予測には校正値で引き直しが必要

失敗パターン (Pitfalls Hit)

  • 評価板のキャビティ側の面は z=0 ではなく z=−4.5mm(板の下面).z=0 を基準にバッフル径を 計算すると要求より小さくなる.センサは z=−50 から +Z を向いてこの面を撮っている
  • バッフル円板のメッシュエッジが対称面と一致するとレイがすり抜ける.蓋の三角形ファンの エッジが XZ / YZ 平面に乗ると,その平面内を通るレイがエッジ上の交差になって数値的に 遮蔽判定を外す(55,473 本中 4〜32 本).円板を半セクタ回転させて解消した.物理的な影響は 無いが,遮蔽の検証を曖昧にする
  • subprocess.run の出力は Windows 既定の cp932 で復号される.sm-render の日本語ログで UnicodeDecodeError になり読取スレッドが落ちる.レンダ自体は成功するので結果は残るが, 本当に失敗したときエラー本文が読めなくなる.encoding="utf-8" を明示すること
  • 生の CoV で半径依存を読むと結論を誤る(結果 2).必ず構造とノイズを分離するか, 同心円プロファイルで比較する
  • 輪帯プロファイルは ROI 平均ではなくピークで正規化する.平均正規化では曲線の基準の高さが 条件ごとに違い,「どれだけ落ちるか」が読み取れない
  • レンダ所要は 1 条件 440〜500 秒(このマシン,spp=1024・d=16・512²).axial_wall 系の 200〜330 秒より遅い

次にやること (Next Steps)

  1. similar_g2 の残り 7 半径を流してカーブを埋める(約 55 分)
  2. 井戸の残り(r=250 でも外側 8.75% vs 内側 3.24%)を詰めるなら,ロフトの深さ比 (CUT_Z_RATIO=−0.40)と接続円の緯度(CENTER_Z_RATIO=−0.92)自体をスイープする
  3. ノイズフロアの測定(同一条件を seed 違いで 2 本)と,バッフル構成での spp 増加
  4. 実機予測に使うなら材質を TEST_14 の校正値(ρ≈0.81 純 diffuse)に差し替えて引き直す

再現コマンド (Reproduction)

# 幾何生成のみ(3D 配置確認用.レンダはしない)
uv run python scripts/sweep_sphere_radius.py --prepare-only --cavity similar_g2

# 遮蔽の検証(評価板から LED へのレイが全て遮られることを実測)
uv run python scripts/verify_baffle_occlusion.py --all-radii --cavity similar_g2

# 幾何確認図・半割り断面
uv run python scripts/build_radius_geometry_figure.py --shots-dir <dir> --cavity similar_g2
uv run python scripts/show_scene_cutaway.py --scene configs/_tmp_sphere_radius/scene_board_baffle_similar_g2_r170.yaml

# スイープ本体
uv run python scripts/sweep_sphere_radius.py --variant board_baffle --cavity fixed_cut
uv run python scripts/sweep_sphere_radius.py --variant board_baffle --cavity similar_g2 --radii 100 170 250

# 可視化
uv run python scripts/build_radius_sweep_visual.py --variant board_baffle
uv run python scripts/build_radial_comparison.py --variant board_baffle

出力: output/sphere_radius_sweep/board_baffle/(fixed_cut 10 条件)と output/sphere_radius_sweep/board_baffle_similar_g2/(3 条件).

参照 (References)