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

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

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

関連:

背景・動機 (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)

半径を変えるときのキャビティ形状の決め方を 3 通り用意した.いずれも 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(接線 + 曲率を一致)
similar_radial同上の相似スケール2 次元パラメトリック Hermite(リム接線を半径方向に取る)

fixed_cut / similar_g2 はどちらも「z を等間隔に進めながら半径 ρ(z) を決める」書き方なので, リムでの傾きは dρ/dz = 0,すなわち板に垂直に立ち上がる形しか表現できない. similar_radial はロフトを (ρ, z) の 2 次元パラメトリック曲線に変え,リムの接線を 半径方向(水平)に取れるようにしたものである(張り出しの強さは弦長比 RADIAL_TANGENT_SCALE=0.6).

結果 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%).首が無くなったぶん光の閉じ込めが減ったと 考えられる.

結果 6 — 板直下の「喉」を消すと決定的に効く (Removing the Throat Is Decisive)

similar_g2 でも r=250 で外側 8.75% vs 内側 3.24% と井戸が残っていた. 断面を見たユーザーの指摘「半径が大きいほどくびれて見える」を数値化すると, 板の直下に喉(throat)ができていることが分かった.r=250 では板の縁から 12.8mm 下がっても 半径が 48 → 49.2mm しか広がらず,そこから急に外へ開く.リムの接線が板に垂直だからである.

リムの接線を**半径方向(水平)**に取ると喉は消える.板縁から 10mm 下の半径は 49.2mm(垂直)→ 85.1mm(水平・k=0.6)になり,天井が板の縁からそのまま外へ広がって 球へ回り込む形になる.

3 設計を全 10 半径(similar_g2 のみ 3 半径)で比較した.

r mmfixed_cut
外側 / min-max / 構造 CoV
similar_g2similar_radial
885.59% / 0.895 / 0.0232—6.78% / 0.846 / 0.0359
956.39% / 0.857 / 0.0316—5.98% / 0.863 / 0.0325
1007.02% / 0.861 / 0.03127.69% / 0.852 / 0.03285.71% / 0.864 / 0.0310
1107.17% / 0.868 / 0.0302—4.81% / 0.883 / 0.0280
1207.31% / 0.872 / 0.0289—4.33% / 0.888 / 0.0258
1358.08% / 0.873 / 0.0270—4.01% / 0.902 / 0.0230
1509.70% / 0.860 / 0.0281—4.11% / 0.919 / 0.0209
17012.08% / 0.844 / 0.03006.94% / 0.883 / 0.02563.24% / 0.914 / 0.0193
20015.11% / 0.819 / 0.0361—2.58% / 0.934 / 0.0169
25017.97% / 0.779 / 0.04788.75% / 0.891 / 0.02722.27% / 0.944 / 0.0145

外側の落ち込みが 2.27% まで下がった.fixed_cut の 8 分の 1,similar_g2 の 4 分の 1 である. 喉が井戸の主因だったことがこれで確定した.

内側・外側の両方が半径とともに改善するようになった.当初の想定(大きいほど理想積分球に 近づく)が素直に成り立つ状態で,r=250 でもまだ頭打ちが見えていない.輪帯 min/max は r=95 以降ずっと単調改善で,10 本の輪帯プロファイルが交差せず半径の順に並ぶ.

改善の積み上げ:

段階構造 CoV輪帯 min/max
旧 axial_wall r=100(TEST_11 / TEST_12 の球)0.05790.797
+ バッフル導入(fixed_cut r=100)0.03120.861
+ 接合を相似・G2 化(similar_g2 r=250)0.02720.891
+ リムを水平出し(similar_radial r=250)0.01450.944

r=250 では中心/周辺比 1.036・勾配 3.46%(fixed_cut は 1.110 / 9.88%).

angular_ratio が 0.49 に跳ねるが悪化ではない. 内訳は角度方向の分散が 12.9 → 11.9 と微減, 動径方向の分散が 200.0 → 12.5 と 16 分の 1 に潰れている.軸対称性は保たれたままドーム構造が ほぼ消えたために比が上がっただけで,この構成では angular_ratio を単独で読んではならない.

r=88 と 95 では水平出しが負ける(構造 CoV 0.0359 vs 0.0232 @ r=88).交差は r≈95 付近で, 小さいキャビティでは天井を外へ張り出す余地がなく不利になる.小型機なら fixed_cut, 大型なら similar_radial,という切り分けになる.

結論 (Conclusions)

  • バッフル構成は有効.同じ r=100 で構造 CoV を 46% 減らし,上下の傾きも消える
  • キャビティサイズは,接合が自然であって初めて効くレバーになる.接続円を固定したまま球だけ 大きくすると,中心は平らになるが周辺が崖になり差し引きで悪化する
  • 効きが最も大きいのは「リムでの立ち上がり方」である.板に垂直に立ち上げると板直下に喉が でき,これが外側の落ち込みを支配する.リム接線を半径方向に取って喉を消すと,外側の落ち込みは r=250 で 17.97% → 2.27% と 8 分の 1 になる.接合の曲率一致(G2 化)だけでは半分にしかならない
  • 設計の効き目の序列は 喉 > 接合の相似・G2 化 > 球半径 そのもの.球半径は単独ではレバーに ならず,喉と接合を直して初めて「大きいほど均一」という素直な効き方をする
  • 最良は similar_radial の r=250(構造 CoV 0.0145 / 輪帯 min/max 0.944)で,出発点の 旧 axial_wall r=100(0.0579 / 0.797)の 4.0 倍.r=250 でもまだ頭打ちが見えていない
  • 小半径では逆転する.r ≲ 95 では喉なし設計が負けるので,小型機は fixed_cut を選ぶ
  • 絶対輝度は 1/r² で落ちる(r=250 は r=88 の 1/8.5,装置深さは 483mm).実機では露光時間・ ゲインに直結するので,均一性の改善と天秤にかける必要がある

限界・注意点 (Limitations)

  • 全条件 1 シードのみ.ノイズフロア(seed 違い 2 本)は未測定.ただし輪帯プロファイルの 標準誤差は条件間の差の 1/20〜1/100 なので,本文の比較の結論は揺るがない
  • similar_g2 は 3 条件のみ.残り 7 半径(88 / 95 / 110 / 120 / 135 / 150 / 200)は未実行なので, 3 設計を全半径で並べた比較にはなっていない(fixed_cut と similar_radial は全 10 条件)
  • r=88(fixed_cut)だけ突出して良い(輪帯 min/max 0.895)が,隣の r=95(0.857)と不連続で, 実体か揺らぎか未確定.r=88 は接続面が球中心のわずか 21mm 上で幾何が質的に違う
  • リム水平出しの張り出し量 RADIAL_TANGENT_SCALE=0.6 は未最適化.0.4 / 1.0 でも幾何は破綻 しない(ρ・z とも単調)ことを確認しただけで,レンダで比較していない
  • リムで水平に出すと壁が板の縁に薄い刃先で当たる.現状は板の厚み内に 1.5mm 食い込む襟で シールしているので,実機では襟の作り方を別途詰める必要がある(シミュ上は問題ない)
  • バッフル構成は 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 平均ではなくピークで正規化する.平均正規化では曲線の基準の高さが 条件ごとに違い,「どれだけ落ちるか」が読み取れない
  • 輝度マップの正規化に画素単位の最大値を使ってはならない.MC ノイズの外れ値(firefly)に 張り付き,本スイープでは max/min が 2.9〜15.5 まで暴れる.20 分割の輪帯平均の最大値を 1.0 とすれば,1 リングあたり数千画素の平均になるので基準値が安定し,条件間を同じ物差しで 並べられる.分割数は評価パイプライン(calc_radial_profile の既定)と揃えると, 輝度マップの「最大輪帯」と輪帯プロファイルの「ピーク」が同じ輪帯を指す
  • angular_ratio は分母が潰れると跳ねる.similar_radial の r=250 では角度方向の分散が 微減しているのに比が 0.06 → 0.49 に上がる.動径方向の分散が 16 分の 1 に潰れたためで, 軸対称性の悪化ではない.分散の内訳(angular_variance / radial_variance)を見ること
  • レンダ所要は 1 条件 440〜500 秒(このマシン,spp=1024・d=16・512²).axial_wall 系の 200〜330 秒より遅い

次にやること (Next Steps)

  1. リム張り出し量 RADIAL_TANGENT_SCALE(現在 0.6)のスイープ.喉が最も効くレバーだと 分かったので,その強さの最適化が次に効く見込みが高い
  2. similar_g2 の残り 7 半径を流して 3 設計を全半径で揃える(約 55 分)
  3. 残る外側の落ち込み(r=250 で 2.27% vs 内側 3.02%)を詰めるなら,ロフトの深さ比 (CUT_Z_RATIO=−0.40)と接続円の緯度(CENTER_Z_RATIO=−0.92)自体をスイープする
  4. ノイズフロアの測定(同一条件を seed 違いで 2 本)と,バッフル構成での spp 増加
  5. 実機予測に使うなら材質を TEST_14 の校正値(ρ≈0.81 純 diffuse)に差し替えて引き直す
  6. r=250 は装置深さ 483mm・明るさ 1/7 なので,実機として成立する半径の上限を別途決める

再現コマンド (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/sweep_sphere_radius.py --variant board_baffle --cavity similar_radial

# 可視化(--cavity ごとに出力先が分かれる)
uv run python scripts/build_radius_sweep_visual.py --cavity similar_radial
uv run python scripts/build_radial_comparison.py --cavity similar_radial
uv run python scripts/build_cavity_comparison.py   # 3 設計を半径軸で重ねる

出力: output/sphere_radius_sweep/ 配下に構成別のディレクトリ (board_baffle/=fixed_cut 10 条件,board_baffle_similar_g2/=3 条件, board_baffle_similar_radial/=10 条件).設計比較図は cavity_comparison.png, 接合の断面 before-after は cavity_design_comparison.png と rim_tangent_comparison.png.

参照 (References)