0対象と記号
光源の形が曲線で囲まれていても、点 P の照度は光源を細かく分割せずに、境界に沿った1次元の積分だけで求められます。ここでは次の設定で話を進めます。
- 光源:平面上の領域 。境界 は閉じたベジェ曲線( 次を数本。ツールは3次を4本)。輝度 が一様な完全拡散面で、片面だけが光る。
- 測る点:平面 F 上の点 P。F の単位法線を とする。
- 求める量:P の照度 。輝度 は光源の性質で、点ごとに変わるのは照度。 と書き、(単位は sr)は形状と位置だけで決まる幾何係数。形態係数は 。
この解説が扱うのは、境界が曲線の平面光源です。光源面そのものが曲がっている場合は、条件つきで同じ式が使えます(第10節)。
1全体の流れ
照度の定義である面積分(2重積分)から出発し、5つのステップで「曲線ごとの1次元積分の和」にします。各ステップの中身は第2節で導きます。
-
光源全体にわたる面積分
光源上の点 Q すべてについて足し合わせる。2重積分で、分割数に誤差が依存する。
-
立体角に直す
P から見た光源の広がり (単位球面上の領域)だけで決まる。
-
ストークスの定理で境界の線積分に
領域の積分が、領域の縁に沿った積分になる。
-
縁を曲線 で表す
P から曲線上の点へのベクトル だけで書ける。
-
結果:曲線ごとの1次元積分の和
境界の各曲線について で積分して足す。
ここから道が分かれます。境界が直線なら、最後の積分は閉じた式(Lambert の公式)になります(第3節)。境界がベジェ曲線なら被積分関数は有理関数になり、実用上は数値積分で解きます(第4節)。「曲線を線分で近似する」のは、前者の道に無理やり乗せる方法です(第6節)。
2導出を順に追う
2.1 面積分から立体角へ(ステップ 1→2)
光源上の微小面積 を P から見た立体角は です。したがって となります。光源側の と は、面積を立体角に換算する係数そのものだったわけです。輝度 は方向によらず一様なので、 を積分の外に出せます。
さらに なので、照度は「光源の方向 を、光源が張る立体角の上で足し合わせたベクトルに、 を掛けたもの」になります。なお の方向(F の水平線より下)は照度に寄与しないので、 は水平線より上の部分に限ります。これが第7節のクリッピングです。
2.2 領域の積分を縁の積分に(ステップ 2→3)
を縁の積分にするのが、ストークスの定理です。次のように示せます。
定ベクトル を1つ取り、 とおきます。 です。単位球面(外向き法線 )でストークスの定理を使うと
左辺はスカラー三重積の並べ替えで に等しく、 は任意なので、ステップ 3 の式が得られます。
検算: が上半球なら、縁は赤道 で、。右辺は 。左辺を直接計算した と一致します。
向き:縁は「球の外側から見て反時計回り」にたどります。これは、P から見ると時計回りです。逆向きにたどると全体の符号が反転します。実装では、光源の境界の向きを面積の符号で判定し、自動で補正します。
2.3 曲線で書く(ステップ 3→5)
縁を、パラメータ のベジェ曲線 の像として表します。P から曲線上の点へのベクトルを 、、 とすると
( なので第2項が消えます。)これをステップ 3 に代入して との内積を取ると、ステップ 5 の式になります。
幾何の意味: と書けます。 は、P から見た方向が の間に回る角、 はその回転面(P と曲線の接線を含む平面)の単位法線です。つまり
は「P から見た境界の見込み角を、回転面の傾き で重みづけして足したもの」です。回転面が水平()なら見込み角がそのまま効き、回転面が に平行なら寄与は 0 です。
3直線辺の場合:Lambert の公式()
境界が線分 ( は P から両端へのベクトル)なら、 で、次の2つが成り立ちます。
- は によらない定数。回転面 が辺の上で一定。
- は の2次式。
したがって は辺全体を見込む角 ( と のなす角)そのものです。辺の寄与は となり、多角形の は
(Lambert の公式。頂点の並びの向きは第2.2節の向きに合わせます。)
この式は平方根・逆三角関数だけで書けて、近似誤差がありません。多角形では、これが最後の答えです。
4ベジェ曲線の場合と次数
4.1 被積分関数の次数と、ベジェ形式での表し方
次のベジェ曲線 ( は Bernstein 基底)では、 は、制御点 を持つ 次のベジェ曲線です。ステップ 5 の被積分関数を と書きます。
は 次で、 は素朴に数えると 次です。ところが、 は実際には 次です。まず、冪の形で確かめます。
冪基底で数える
( は3次元ベクトル)と書くと、 で、
です。最高次()の項は で消えます。次の の係数は です。結局 は高々 次です。
ただし、この方法は、ベジェ形式の制御点を冪基底の係数に直し、多項式どうしを掛けています。次数が上がると桁落ちが大きくなります(下の「数値的に安定」)。
ベジェ形式のまま作る(Bernstein 基底の積の公式)
冪基底に直さなくても、 と は Bernstein 係数のまま作れます。 は、制御点 の 次のベジェ曲線(ホドグラフ)です。Bernstein 基底の積は、次の公式で1つの基底にまとまります。
これを、 と の積に使うと、
となります。 も も、制御点 や を持つベジェ関数として、制御点の外積と内積だけで求まります。ツールが球の影で使う6次多項式 も、同じ公式で作っています。
「最高次が消える」は、Bernstein 形式では次数上げとの整合になります。この は 次の形ですが、実際は 次の多項式を次数上げしたものです。次数を1つ下げる漸化式
を最後まで進めると、 が(丸め誤差の範囲で)成り立ちます。これが、冪基底で「最高次の項が消える」ことに対応します。実験1で、係数を並べて確かめられます。
ベジェ形式で持つ利点は次のとおりです。
- 冪基底への変換が要りません。制御点の差と積の和だけで作れます。
- 数値的に安定です。制御点をランダムに選んだ を、厳密な有理数の値と比べました(各次数 120 個の多項式、 の最大値で正規化)。冪基底で作った場合の最大誤差は、 で 4×10-12、 で 5×10-8、 で 2×10-3 と、次数とともに悪化しました。Bernstein の積の公式では、どの次数でも 10-15 台(最大 8×10-16)でした。3次()では、冪基底でも最大 4×10-15 で、実用上の差は出ません。
- 凸包性が使えます。係数の最小値・最大値が、その区間での 、 の下限・上限になります。 の最小値は、P から曲線までの距離の2乗の下限です(第5.2節)。 がすべて同符号なら、被積分関数の符号が区間全体で一定と分かります。
- の根も、ベジェクリッピングで求められます。これは、P から見た方向の回転面が水平になる点()です。
- は有理ベジェ関数です。 を 次に次数上げして係数を とすると、 は、重み 、制御値 の有理ベジェ関数です。重みが正なら、凸包性がそのまま使えます。正でない区間は、de Casteljau 法で細分すれば、やがて正になります。
3次のベジェ曲線では、冪基底でも問題は出ません。ベジェ形式の利点が効くのは、高次のベジェ曲線( ほど)を扱うときと、凸包性で範囲を囲みたいときです。
実験 1:N と D を、冪基底とベジェ形式で作って比べる
ランダムな制御点の 次ベジェ曲線について、 と の係数を、(左)冪基底に直して掛け算する方法と、(右)Bernstein 基底の積の公式の2通りで作ります。P は原点です。右の は 0 になりません。 次の多項式を次数上げした形だからで、その整合を下の行で確かめます。
4.2 次数ごとの整理
| 次数 | 分子 | 分母 | を閉じた式で書くには | ||
|---|---|---|---|---|---|
| 1(線分) | 1次 | 0次 | 0次(定数) | 2次 | 逆三角関数1つ。Lambert の公式 |
| 2 | 2次 | 1次 | 2次 | 4次 | 4次方程式の根が必要(共役な根が2組) |
| 3 | 3次 | 2次 | 4次 | 6次 | 6次方程式の根が必要(一般には代数的に解けない) |
| 4 | 4次 | 3次 | 6次 | 8次 | 8次方程式の根が必要 |
| 次 | 次 | 次 | 次 | 次方程式の根が必要 |
は、P が曲線上にない限り実数の では正で、実根を持ちません。根は 組の複素共役な対になります。部分分数に展開すれば各対から arctan と log の項が出て、原理的には閉じた式で書けます。しかし、そのために毎回 次方程式を数値的に解く必要があり、P や曲線が変わるたびにやり直しです。 では、閉じた式を経由するより数値積分のほうが実用的です。線分()が特別なのは、分子が定数になって根探しが不要になるからです。
4.3 被積分関数はどんな形か
被積分関数 は、 あたりの見込み角の増え方()に傾き を掛けたものです。P が曲線から離れていれば緩やかですが、P が曲線に近づくと、近い点のまわりで幅がおよそ「距離 ÷ 速さ」の鋭いピークになります(ローレンツ型)。光源が測定点に近いほど、この尖りが問題になります。
実験 2:被積分関数と求積点
円盤(4本の3次ベジェ、半径 1)の境界を一周したときの です。横軸は曲線 0〜3 をつないだパラメータ。P は光源の真下から 方向にずらせます。 で境界の真下に来ます。○ はガウス求積の点です。
4.4 ガウス=ルジャンドル求積と適応分割
滑らかな被積分関数には、ガウス=ルジャンドル求積が向いています。 点の求積の誤差は 程度( は被積分関数の解析性で決まる)で、指数的に減ります。 は、区間 を焦点とするだ円のうち、最も近い複素特異点( の複素根)に接するものの大きさで決まります。
- P が曲線から遠い:特異点は実軸から遠く、 が大きい。数点で十分。
- P が曲線に近い:特異点が実軸のすぐ近くに来て、。同じ点数では精度が出ない。
そこで、区間を二分して を稼ぎます。二分するかどうかは、その区間の曲線が P にどれだけ近いかで決めます。区間の弧長が P までの距離を大きく超えると、被積分関数が区間の中で大きく変わるからです。
距離の下限を、制御点から保証する(近似ベジェクリッピング)
区間の曲線の制御点(P からの相対座標)から、第4.1節の公式で の Bernstein 係数 ( 次)を作ります。凸包性から、その区間で
が保証されます。最近点そのものを求める必要はありません。区間を de Casteljau 法で二分するたびに、下限は真の最小値に近づきます(区間幅の2乗で縮みます)。弧長の上界は、制御多角形の長さです。そこで、次の条件のとき二分します。
端点と中点の3点で距離を見積もる旧方式は、3点の間を曲線が通り抜けると、距離を過大に見積もることがあります。この方式は、距離の下限が保証されます。ただし、保証されるのは距離の下限で、求積の誤差そのものではありません。
もう1つの案は、最近点 を求めることです。 の実根( 次)なので、これもベジェクリッピングで求まります。 で区間を分け、 に向かって幅を半分ずつ縮めます。ここでも根を厳密に求める必要はなく、許容誤差 で打ち切っても精度は変わりませんでした。
実験 4:距離の下限を、細分して締める
円盤(4本の3次ベジェ)の曲線 0 について、(青)と、区間を 個に分けたときの制御点の最小値(帯)を描きます。帯は、その区間の の保証つきの下限です。赤い帯は、上の条件で「まだ二分が必要」と判定される区間、緑は「そのままガウス求積してよい」区間です。
2,400 点で比べた結果です(円盤の半径 0.7〜1.5、高さ 0.08〜3、傾き ±0.6、制御点を ±0.25 ずらした 40 通りの光源に、平面 F 上の点を60個ずつ。基準は、ガウス16点で、弧長が距離の 0.1 倍を超えたら二分した値)。
| 分割の判定 | 点数 | 最大の相対誤差 | RMS | 1点あたり |
|---|---|---|---|---|
| 簡易(3点、弧長 > 0.6×距離) | 8 | 4.2×10-6 | 1.1×10-7 | 3.2 µs |
| 保証つき下限() | 8 | 4.2×10-6 | 1.2×10-7 | 6.2 µs |
| 保証つき下限()(既定) | 16 | 3.3×10-10 | 1.2×10-11 | 3.4 µs |
| 最近点で分割(幅の半減 5 段、許容誤差 10-3) | 8 | 6.5×10-8 | 1.5×10-9 | 8.1 µs |
- 同じ点数(8点)では、保証つき下限は、簡易判定と精度が同じで、時間が約2倍かかります。制御点から下限を作る分の手間です。
- ただし、保証があるので、二分の基準をゆるめ()、そのぶん点数を上げて(16点)も、安全に使えます。この組み合わせが、簡易判定と同じ時間で、最大誤差を 4 桁小さくしました。ツールの既定にしています。
- 最近点で分ける方法は、根を求める分だけ遅く、この試験では保証つき下限に及びませんでした。ツールでは、選択式で使えます。
次数 は、必要な点数をほとんど決めません。点数を決めるのは、形の滑らかさと P までの距離です。 が上がると特異点の数( 組)と分子の次数が増えますが、3次で P が遠ければ 8〜10 点で機械精度に届きます(実験5)。次数が直接効くのは、次に述べる交点の計算です。
4.5 次数が効くもう1つの場所:交点の計算
境界を「水平面で切る」(第7節)、「影の輪郭と交わる」(第9節)には、曲線と平面の交点が要ります。曲線上の点が平面 (P を通る平面)にあるという条件は、 なので の 次方程式です。線分()なら1次方程式で済みます。3次以上の実根は、ベジェクリッピング法で求められます(第5節)。
5ベジェクリッピング法が使える箇所
第4.5節の「 次方程式の実根を求める」場面は、ベジェクリッピング法(Sederberg と Nishita、1990)でまとめて解けます。もとは曲線どうしの交点を求める方法ですが、多項式の実根探しにも使えます。ツールの根探しは、この方法に入れ替えてあります。
5.1 仕組み
多項式を Bernstein 形式 で持ちます。点 を制御点とするベジェ曲線が、ちょうど のグラフです。ベジェ曲線は制御多角形の凸包の中に入る(凸包性)ので、 の根は、凸包が 軸と交わる範囲の中にしかありません。
- 係数 がすべて同符号なら、根はありません。ここで打ち切ります。
- そうでなければ、区間を、凸包が 軸と交わる範囲 に縮めます。縮めた区間の係数は de Casteljau 法で作ります。
- 区間があまり縮まなかったとき(元の7割以上が残るとき)は、二分してそれぞれを続けます(複数の根があるとき)。
- 区間が十分に小さくなったら、その中点を根とします。
単根の近くでは収束が速く(2次収束)、ツールの試験では平均 5〜8 回の反復で終わりました。二分法は1回に1ビットずつなので、同じ精度に40回ほどかかります。実験3で、1回ごとの様子を見られます。
厳密な根が要らないとき(近似ベジェクリッピング)
ベジェクリッピングは、根や最小値を厳密に求めなくても役に立ちます。
- 打ち切りを粗くする。根を、区間の分割位置のような近似で足りる用途に使うなら、許容誤差を 程度にして早く打ち切れます。
- 根や最小値を求めず、細分した各区間の制御点の最小値・最大値だけを見る。凸包性から、真の最小値の下限(最大値の上限)が保証され、細分するほどきつくなります。第4.4節の分割判定は、この使い方です(実験4)。
実験 3:ベジェクリッピングを1回ずつ進める
グラフは、いま調べている区間の多項式を、区間を [0,1] に引き伸ばして描いたものです。折れ線が制御多角形、薄い塗りが凸包、緑の帯が「凸包が 軸と交わる範囲」です。「1回進める」を押すと、区間がその帯に縮みます。
5.2 使えるところ、使えないところ
| 場所 | 解く問題 | 使えるか | 効果・注意 | ツール |
|---|---|---|---|---|
| 水平面クリッピング(第7節) | ( 次) | 使える | Bernstein 係数は制御点の そのもの。冪基底への変換が要らない。 | 実装済み |
| 影の交点(第9節) | 使える | 係数がすべて同符号なら、根を探さずに打ち切れる。P ごとに多数回呼ぶので効く。 | 実装済み | |
| 球の輪郭との交点(第9節) | ( 次。3次なら6次) | 使える | 係数は制御点の積(Bernstein 形式の積の公式)で作れる。次数が高くても同じ手続き。 | 実装済み |
| 光源境界の自己交差の検出 | 曲線どうしの交点(平面)と、1本の曲線のループ | 使える | ファットラインで互いを縮める(5.4節)。1本の曲線は8つに分け、隣り合わない組を調べる。 | 実装済み |
| 適応求積の分割判定(第4.4節) | P から曲線までの距離の下限 | 使える(近似) | の Bernstein 係数の最小値が、真の最小値以下という保証つきの下限。区間を細分して締める。 | 実装済み(既定) |
| 最近点 (第4.4節) | ( 次) | 使える(近似) | 許容誤差 10-3 で打ち切ってよい。分割判定としては、保証つき下限に及ばない。 | 実装済み(選択式) |
| 光源領域の内外判定(影の判定) | 点 が閉曲線の内側か | 使える | 右向きの半直線と各曲線の交点数。交点は の実根で、係数が同符号なら即除外できる。折れ線への近似が要らない。 | 実装済み |
| 面積分の検算の標本 | 各走査線と曲線の交点 | 使える | 同様に の実根で、走査線の区間を厳密に求める。 | 実装済み |
| モンテカルロの標本の棄却判定 | 候補の点が領域の内側か | 使える | 光源領域の内外判定と同じ。 | 実装済み |
| ベジェ曲面の遮蔽物と光線の交点 | 光線と曲面パッチの交点 | 使える | 本来の用途(Nishita・Sederberg・Kakimoto、1990)。モンテカルロ法や検算で、遮蔽物が曲面のときに効く(第9.5節)。 | 未実装 |
| 第4.2節の の根 | 複素根(部分分数のため) | 使えない | ベジェクリッピングは実根だけを求める。 は実根を持たない。 | — |
| 積分そのもの | 使えない | 根や交点を求める方法で、積分はしない。 | — | |
| 曲面の輪郭(シルエット) | 2変数の陰関数曲線 | そのままは使えない | 曲線の交点や1変数の根とは別の問題(第9.4節)。 | — |
5.3 入れ替えて分かったこと
- 結果は変わりません。旧実装(冪基底に直して、導関数の根で区切って二分法)と、9,000 点で照度係数の最大差は 6×10-15 でした。
- 速さもほぼ同じです。3次では旧実装も十分速く、64×64 格子で 77 ms が 79 ms でした。効くのは、次数が上がる場合(球の6次)と、根なしの組を打ち切れる影の計算です。
- そのまま作ると根を取りこぼします。区間の端にある根が、丸め誤差で符号が揃って消えます。縮めた区間に、ごくわずかな余白を足して解決しました(3・5・7次で各 1,500 個の多項式が、標本から数えた根の数と全件一致)。
- 内外判定・走査線・標本の判定は、結果も速さも同じで、折れ線への近似が消えました。光源領域の内外判定は、2万点で、256辺の折れ線による判定との不一致が0点でした(時間は 20 ms と 21 ms)。影つき照度は 5,520 点で最大差 0 でした。
- 自己交差の検出は、そのままだと遅くなりました。隣り合う曲線は、共有するアンカーでほぼ重なるため、クリッピングが収束しにくく、円盤で1回 25 ms かかりました。アンカーの近傍どうし(パラメータで 3%×3%)だけを除き、残りを2つの長方形領域に分けて調べると、0.4 ms になりました。400 個の形を、折れ線にした総当たりと比べ、全件一致しました。ただし、1本の曲線のループは、隣り合う部分を調べないので、パラメータで約 0.25 より小さいループは見逃します。
5.4 曲線どうしの交点:ファットライン
曲線 と の交点は、次のように求めます。 の両端を結ぶ直線を中心に、 の制御点をすべて含む帯(ファットライン)を作ります。 の各制御点までの距離を Bernstein 係数とみなし、その凸包がこの帯と交わる範囲だけに の区間を縮めます。次に役割を入れ替えて を縮め、これを繰り返します。縮まらなければ、長いほうを二分します。
- ツールは、光源の4本の曲線どうしで交点を調べ、交差があれば警告を出します。ランダムに崩した 300 個の形を、折れ線にして総当たりで調べた結果と比べ、全件一致しました。
- 隣り合う曲線は、共有するアンカーで接します。そこを交点と誤検出しないよう、アンカーの近傍(パラメータで 0.002 以内)は除外しています。
- 帯には、丸め誤差に備えて 10-9 ほどの余白を足しています。
6多角形近似・モンテカルロ法との違い
6.1 3つの方針
折れ線は、1次のベジェ曲線の列です。第4.2節の表のとおり、閉じた式が得られるのは だけです。そこで、光源の形と積分のどちらを近似するか、あるいは面積分を確率的に解くかで、方針が3つに分かれます。
| 境界積分(ベジェのまま) | 多角形近似 | モンテカルロ(小円盤) | |
|---|---|---|---|
| 方針 | 形は厳密のまま、境界の積分を数値で解く | 形を折れ線で近似し、積分は厳密に解く | 光源を N 個の小円盤に置き換え、面積分を確率的に解く |
| 次元 | 境界の1次元積分 | 境界の閉じた式 | 光源全体(2次元)の抜き取り |
| 誤差の主因 | 求積。点数 に対して指数的に減る | 形状の近似。 | 標本のばらつき。一様乱数なら 、準乱数ならほぼ |
| 誤差の性質 | 偏りなし。P が曲線に近いと悪化 | 凸な光源では常に暗め | ばらつく(ざらつき)。小円盤の大きさによる小さな偏りもある |
| 1回あたりの計算 | やや重いが、少ない点数で足りる | 軽い | 1個は軽いが、N 個要る |
| 影 | 輪郭との交点を解く(箱・球で実装) | 同じ枠組みで、交点が1次方程式になる | 光線が遮蔽物に当たるかを調べるだけ。形を選ばない |
| 実装 | 求積・根探し・区間管理が要る | 簡単 | いちばん簡単 |
6.2 モンテカルロ法の中身
光源領域 (面積 )に 個の点を、 の中で一様になるように置きます。それぞれを、面積 、半径 の小さな円盤光源とみなします。円盤光源の照度は、円盤の中心軸上の点なら解析的に求まります。
( は円盤中心までの距離。円盤の張る円錐が水平線の上にあるとき。)P が軸から外れる分は、円盤を斜めから見る分の を掛けて補います。全体では
です。分母の が要点です。小円盤を点光源とみなすと分母は で、小円盤の中心が P に近いと1個の値が大きくなり、ばらつきが増えます。円盤の大きさ を入れると、この発散が抑えられます。代わりに、 程度の小さな偏りが残りますが、 が増えると円盤が小さくなって消えます。軸から外れる分の補正も、円盤が小さいほど正確です。
- 一様乱数: を4倍にして誤差がおよそ半分になります。10倍の精度には100倍の点が必要です。
- 準乱数(Halton など):点が領域を均等に埋めるので、誤差がほぼ で減ります。同じ で一様乱数より1桁近く正確になる例もあります。
- 影:P から各円盤の中心へ光線を飛ばし、遮蔽物に当たれば0とします。円盤ごとの二値なので、半影は が少ないとまだらになります。
6.3 誤差と手間の比べ方
同じ円盤を、(青)ベジェのまま 点のガウス求積(分割なし)、(緑)1曲線を 本の線分で近似した多角形、(紫) 個の小円盤のモンテカルロ法で解いた誤差を並べます。モンテカルロは、標本を変えた複数回の RMS 誤差です。
横軸は、「評価回数」と「実測時間」を切り替えられます。評価回数は、境界積分が (4本の曲線 × 点)、多角形が (辺の数)、モンテカルロが です。1回の評価の重さは方式で違うので、実測時間で見ると並びが変わります。
実験 5:3つの方式の誤差と手間
基準値は、ガウス求積16点で 256 区間に分けた高精度の値です。縦軸は基準値に対する相対誤差(対数)で、下限は 10-16 で頭打ちにしています。
実測時間は、多角形の頂点やモンテカルロの標本をあらかじめ作っておき、P の照度を求める部分だけを測っています。ブラウザや他の処理の影響で、数十% ほどばらつきます。
光源が遠い(高さ 3、)と、ベジェのままなら 10 点ほどで機械精度(10-15 程度)に届きます。多角形は 64 分割でも 10-4 前後、モンテカルロは同じ手間(評価 256 回)で、一様乱数なら 3×10-3 前後、Halton なら 1×10-3 前後です。光源を P に近づける(高さ 0.1、)と、どの方式も収束が遅くなります。モンテカルロは、小円盤が P に近い分だけばらつきが大きく、一様乱数では 256 個で 0.4 ほど、4096 個でも 0.14 ほどの相対誤差になります。
6.4 収束が速い・遅い理由
- 多角形():曲率 の曲線を長さ の弦で置き換えると、最大のずれは 程度です。立体角のずれはこれに比例し、 から になります。分割を10倍にして、やっと2桁です。
- ガウス求積(指数的):被積分関数が滑らかな(解析的な)ので、数点増やすだけで桁が上がります。
- モンテカルロ():標準偏差は です。被積分関数の起伏()が大きい、つまり光源が近いほど遅くなります。
6.5 使い分け
| 目的 | 向く方式 | 理由 |
|---|---|---|
| 高い精度が要る、評価回数を抑えたい | 境界積分 | 数点で機械精度に届く。多数の点を計算するときも有利。 |
| 数%の誤差でよい、リアルタイム描画 | 多角形近似 | 1点あたりの計算がいちばん軽く、既存の多角形光源のコードを使える。 |
| 遮蔽物の形が複雑・曲面・複数 | モンテカルロ | 光線が当たるかだけを調べればよい。形を選ばない。 |
| 影のない範囲を高精度に、影は大まかに | 併用 | 光源全体は境界積分で解き、遮蔽された分だけをモンテカルロで見積もる(第9.6節)。 |
| 光源が P に近い | どれも注意 | 多角形は が急増、ベジェは適応分割、モンテカルロはばらつきが増える。 |
ツールで測った一例です(円盤、高さ 2.2、遮蔽物なし、64×64 格子、ブラウザでの実測。環境や乱数で大きく変わります)。
| 方式 | 平面全体の RMS 差(最大照度比) | 1点あたりの時間 |
|---|---|---|
| 境界積分(既定の適応分割) | 基準 | 約 7〜10 µs |
| 多角形 16 辺 | 1.05 % | 約 1.5〜2 µs |
| モンテカルロ 256 個(一様乱数) | 0.4〜2 %(乱数の引き方で変わる) | 約 2.5〜5 µs |
| モンテカルロ 4096 個(Halton) | 0.03〜0.04 % | 約 25〜30 µs |
球の影を入れると差が広がります。P の1点で、誤差 1% に届くまでの時間は、境界積分が 13 µs、モンテカルロが約 7 ms でした(ツールの「精度と時間のグラフ」の結果)。影の縁では、円盤ごとの二値判定がばらつきの原因になります。
7実際の計算手順
ツールが、P ごとに行っている処理の順番です。各手順で「次数」がどこに効くかも併記します。
- 光源を組み立てる:光源平面の局所座標 で12個の制御点を持ち、世界座標に変換して4本の3次ベジェにします。
- 発光側の判定:P が光源平面の表側にあるか()。裏側なら 。
- 向きの補正:局所座標での面積(シューレース公式)の符号 で、境界の向きを判定します。
- 水平面クリッピング:F より下の部分は で、そのまま入れると誤った(負の)寄与が混ざります。 は 次多項式なので、その実根(ベジェクリッピングで求めます。第5節)で曲線を切り、上側の区間だけ残します。切断で生じた2点は、F 上の直線(弦)でつなぎ、その寄与は角 です。P が F 上にあるとき、P の水平面は F そのものなので、この切断はどの P でも同じで、1回だけ計算すれば済みます。
- 曲線ごとの積分:残った各区間で、適応ガウス求積により を求めます。区間を分けるかは、制御点から求めた距離の保証つき下限で決めます(第4.4節)。
- 合計:。 は向きの符号です。。
計算の中心にあたる部分を抜き出すと、次の形です。 なので、外積の内積は y 成分だけになります。
// 曲線区間 [ta, tb] の ∫ n·(v×v') / |v|² dt (v = B(t) − P)
function gauss8(c, ta, tb, P) {
const h = (tb - ta) / 2, m = (ta + tb) / 2;
let sum = 0;
for (let k = 0; k < 8; k++) {
const t = m + h * GX[k]; // ガウス点
const v = B(c, t) - P; // P から曲線上の点へ
const dv = dB(c, t); // 接線ベクトル
const num = v.z * dv.x - v.x * dv.z; // n·(v×v') (n = (0,1,0))
sum += GW[k] * num / dot(v, v);
}
return sum * h;
}
// P ひとつ分の境界積分
let s = 0;
for (const piece of clip.pieces) s += integrate(curve[piece.ci], piece.ta, piece.tb, P); // F より上の曲線
for (const chord of clip.chords) s += atan2(n·(a×b), a·b); // F 上の弦
const G = 0.5 * KAPPA * sigma * s; // E = L * G
8数値で追う
円盤の光源で、第7節の手順を数値で追います。P の真下から光源の縁の真下まで動かして、各曲線の積分値がどう変わるか、多角形との差がどうなるかを見てください。
実験 6:曲線ごとの寄与と合計
光源は半径 1 の円盤(4本の3次ベジェ)、輝度 1000 cd/m²、P は平面 F 上にあり光源全体が F より上にあります。各曲線の を高精度に求め、 を作ります。
9影の計算
光源と P のあいだに遮蔽物があるとき、境界積分のまま影(半影を含む)を扱えます。ツールが対応しているのは、直方体と球です。ここでは、考え方と、それ以外の形でどこが難しくなるかを整理します。
9.1 考え方
- P から見た遮蔽物の輪郭 は、単位球面上の領域です。P から の内側の方向に進むと、遮蔽物に当たります。
- 光が届く分は です。
- の境界は2種類です。(a) 光源の境界曲線のうち の内側の部分。(b) の輪郭のうち光源 の内側の部分。
9.2 直方体(凸多面体)
- 輪郭 は、単位球面上の凸多角形で、辺は大円弧(=P から見た直線辺)です。P に向いた面と向いていない面の境界の辺をたどると、向きの揃った閉じた輪が得られます。
- (a) は、境界曲線と「P と の辺を含む平面」の交点を求めて区間に分けます。交点は 次方程式の根で、ベジェクリッピングで解きます。区間が の内側かは、区間の中点で判定し、内側の区間を第4節の積分で足します。
- (b) は の辺が直線なので、第3節の閉じた式です。
- 多角形近似では光源の辺も直線なので、(a) の交点は1次方程式になります。同じ枠組みで扱えます。
- この方法は、直方体に限りません。面のリストがあれば、角柱や角錐などの凸多面体にそのまま使えます。
9.3 球
球は、P から見ると円錐です。中心方向を 、半頂角を (、 は P から球の中心までの距離)とすると、 は を中心とする半頂角 の円(小円)の内側です。
- (a) の交点:光源境界上の点が円錐の縁にある条件は です。 は 次なので、これは の 次多項式(3次曲線なら6次)です。係数は制御点の積(Bernstein 形式の積の公式)で作れるので、ベジェクリッピングで実根を求めます。裏側の円錐()の根は除きます。
- (b) の弧:小円は と書け、次のとおり で積分できます。閉じた式で求まります。
円全体が光源の内側にあるときは です。
光線で遮蔽を調べる面積分と比べ、約 4,000 点(うち影の影響あり約 1,000 点)で、差は で 1〜3×10-4 でした(1回だけ 6×10-3 の外れ値が出ましたが、4.8 万点の再試行では再現せず、参照値側の誤差と考えています)。
9.4 それ以外の形は難しいのか
難しいのは、形が変わるからではなく、次の3つがそろうかどうかです。(1) 輪郭 を求めて、向きの揃った閉じた輪にできる。(2) 光源境界との交点が多項式の根になる。(3) の弧の積分が閉じた式、または扱いやすい数値積分になる。直方体を含む凸多面体と球は、3つともそろいます。
| 遮蔽物 | P から見た輪郭 Σ | 境界積分での扱い | 難しさ |
|---|---|---|---|
| 凸多面体(直方体、角柱、角錐) | 凸な球面多角形。辺は大円弧 | 面の表裏から輪郭をたどる。ツールの箱と同じ | 易しい(箱は実装済み) |
| 球 | 小円 | 交点は 次の根。弧の積分は閉じた式 | 易しい(実装済み) |
| 楕円体、円柱、円錐台 | 2次曲線、または直線と楕円弧の組み合わせ | 交点は多項式( 次)の根で求まる。弧の積分は閉じた式にならず、数値積分が要る | 中程度 |
| 複数の遮蔽物 | 各輪郭の和集合 | 輪郭が重ならなければ足し算。重なるなら和集合が要る | 中〜難 |
| 光源の平面に届く遮蔽物 | 光源側で打ち切る面が加わる | 面を光源の平面で切る処理が要る(ツールは未対応で、影を計算しない) | 中程度 |
| 非凸の多面体 | 面の投影が重なり、輪が複数・穴を持つ | 投影多角形の和集合(ブーリアン演算)が要る。その後は箱と同じ | 難しい |
| ドーナツ、回転体、ベジェ曲面 | 多項式では書けない曲線。穴や自己隠蔽がある | 輪郭を求める処理(2変数の零点、隠れ線処理)が要る | 難しい |
難しい理由は、原理的に不可能だからではなく、(1) の輪郭を求める処理の実装量にあります。非凸の物体は、輪郭の一部が別の部分に隠れます。ドーナツは、外側の輪のほかに、向きの逆の輪(穴)ができます。ベジェ曲面や回転体の輪郭は、 を満たす点の集まりです。これは、1変数の多項式の根ではなく、2変数の陰関数曲線で、曲線としてたどり、隠れる部分を除く必要があります。
9.5 曲面の遮蔽物とベジェクリッピング
遮蔽物がベジェ曲面(球、ドーナツ、回転体をパッチで表したもの)のとき、ベジェクリッピングが効くのは、光線と曲面の交点です(Nishita・Sederberg・Kakimoto、1990)。光線が曲面パッチに当たるかを、パッチの制御点の凸包で絞り込んで判定します。
- モンテカルロ法は、この判定だけで影を扱えます。境界積分のように輪郭を求める必要がありません。
- 面積分による検算(第6節)の遮蔽判定にも使えます。
- 境界積分に必要なのは輪郭で、光線との交点そのものではありません。輪郭を求める部分(2変数の陰関数曲線)には、ベジェクリッピングはそのままでは使えません。
- 回転体は、光線を (r², y) 平面に写すと放物線になり、輪郭の曲線(プロファイル)との交点を、2つの多項式ベジェ曲線の交点としてクリッピングで判定できます。これも、光線ごとの判定です。
ツールは、ドーナツと回転体には対応していません。境界積分で解くには、上の「難しい」行の処理を作る必要があります。
9.6 現実的な選択肢
- 凸な物体は、凸多面体で近似する。球や楕円体を面で刻むと、箱と同じ処理に載せられます。多角形近似と同様に、面の数を増やすほど誤差が縮まります。
- 輪郭を折れ線にして、非凸の物体の和集合を作る。輪や穴を持つ多角形に対する処理が要ります。実装量は大きい代わりに、ノイズのない結果が得られます。
- 併用する。影のない場合の照度を境界積分で正確に求め、遮蔽される分だけをモンテカルロで見積もります。 から、遮蔽された分のモンテカルロ推定を引く形で、ばらつきの大きさは、遮蔽された割合が小さいほど小さくなります。影が小さい範囲では、モンテカルロだけより精度が上がります。
- すべてモンテカルロにする。形を選ばず、複数の遮蔽物も扱えます。ばらつきは、標本数で抑えます。
2と3は、ツールには入れていません。
10曲面光源について
境界積分が使うのは、光源の面ではなく、P から見た光源の輪郭だけです(ステップ 2 の )。式の導出は、光源が平面であることを使っていません( は3次元の曲線なら何でもよい)。したがって、光源面が曲がっていても、次の条件がそろえば、境界曲線だけで照度が決まります。
- 光源の輝度が一様で、完全拡散である(ステップ 2 で が消える条件)。
- P から見えるのが光源の表側だけで、光源のどの点も P に向いて発光している。
- 同じ視線が光源に2回当たらない(自己遮蔽がない)。
このとき、曲面の中の形は照度に影響せず、輪郭 の3次元形状だけが効きます。ただし、ツールの実装は平面光源を前提にしています(発光側の判定、水平面クリッピング、影の内外判定に「境界が同一平面上にある」ことを使っています)。曲面光源を扱うには、これらを3次元の輪郭に対して作り直す必要があります。
11つまずきやすい点
| 症状 | 原因と対処 |
|---|---|
| 結果の符号が逆になる | 境界をたどる向きが逆。P から見て時計回り(球の外から見て反時計回り)に揃える。 |
| 光源が F をまたぐと値がおかしい | 水平面クリッピングの漏れ。F より下の部分と、切り口の弦を忘れない。 |
| P が光源の裏側にあるのに値が出る | 発光側の判定漏れ。裏側は 。 |
| 光源が近いと精度が急に悪くなる | 被積分関数のピーク。区間を二分する(適応求積)。多角形なら分割数を増やす。 |
| 境界が自己交差していると結果が無意味 | 領域が定義できない。制御点を動かして交差をなくす。 |
| 根探しで、区間の端の根が消える | 丸め誤差で係数の符号が揃う。縮めた区間に、ごくわずかな余白を足す(第5.3節)。 |
| 隣り合う曲線が、共有するアンカーで「交差」と判定される | 接する点を交点と誤検出している。アンカーの近傍は除外する(第5.4節)。 |
| モンテカルロの結果がざらつく、影の縁がまだらになる | 点数が足りない。一様乱数なら4倍で誤差が半分。準乱数(Halton)にする、点数を増やす、影の縁は境界積分を使う。 |
| 遮蔽物が光源の平面に届くと、影が出ない | ツールは、光源の平面に届く遮蔽物の影を計算しない。物を小さくするか、光源を上げる。 |
| 光源の境界が P のすぐそばを通る | 被積分関数が鋭いピークを持ち、P が曲線上だと発散する。適応分割を使い、曲線上の点は避ける。 |
境界積分法は、面積分を「境界の見込み角の重みつき和」に直す方法です。境界が線分なら閉じた式(Lambert)、 次のベジェ曲線なら ( 次 / 次)の有理関数の積分で、数値求積で解きます。
と は、Bernstein 基底の積の公式で、ベジェ形式のまま(冪基底に直さずに)作れます。数値的に安定で、凸包性から範囲も囲めます。
多角形近似は形を近似して の誤差を出し、ベジェのままは積分を数値で解いて指数的に減る誤差を出します。モンテカルロ法は、小円盤の解析式を足す方法で、誤差は (準乱数ならほぼ )ですが、形を選ばず影を扱えます。
曲線の実根や交点は、ベジェクリッピングで求めます。使えるのは、水平面クリッピング、影の交点、球の輪郭(6次)、自己交差の検出、光源領域の内外判定です。厳密な根が要らないときは、細分した制御点の最小値で距離の下限を保証する近似の使い方ができ、求積の分割判定に使っています。複素根と積分そのものには使えません。影の計算は、凸多面体と球なら境界積分で解けます。非凸の物体やドーナツは、輪郭を求める処理が難しく、モンテカルロ法か併用が現実的です。