を選択theta
しても、の分布は本来あるべきほど均一ではないarccos(sqrt(rand1))
ため、単位球の表面にランダムに分布した点は得られません。arccos(sqrt(rand1))
球座標で2つのランダムな変量u
とv
、から均一にサンプリングされた(0, 1)
場合、ランダムな点は次のようになります。
theta = 2*pi * u <--- note, no arccos here
phi = arccos(2*v - 1)
これは表面からの反射であるため、球面の半分をサンプリングするだけで済みtheta
ますtheta = pi * u
。
反射角度はランダムであるため、光源がどこにあるかは実際には重要ではありません。つまり、結果は光ベクトルLに依存しません。サンプリングされた半球が外側になるように、球座標を選択するだけで済みます。表面の側面。
別のオプション:
- 単位球全体の表面にランダムな点を描画します(つまり
theta = 2 * pi * u
)
- デカルト点ベクトル座標に変換
- 法線と点ベクトルの内積を取ります。負の場合は、手順1から繰り返します。
これにより、表面の外側に面する半球からのみサンプリングすることが保証されます。
球面座標を完全にスキップして、デカルト座標を直接計算することもできます。
x = sqrt(1 - u^2) * cos(theta)
y = sqrt(1 - u^2) * sin(theta)
z = u
ここでu
は、から均一にサンプリングされ[-1, 1]
(たとえばu = 2*v - 1
、v
で均一にサンプリングされます[0, 1]
)、theta
から均一にサンプリングされ[0, 2*pi)
ます。
三角関数をまったく使用しない別の方法があります(ここから取得)。
から均一にサンプリングしx1
ます。の場合、(そうでない場合は、サンプリングを繰り返します):x2
[-1, 1]
x1^2 + x2^2 < 1
x = 2 * x1 * sqrt(1 - x1^2 - x2^2)
y = 2 * x2 * sqrt(1 - x1^2 - x2^2)
z = 1 - 2 * (x1^2 + x2^2)