1

l(ランバート)拡散反射を計算する方法を理解するのに助けが必要です-つまり、光線が表面に当たってランダムな方向に跳ね返るときです。したがって、光源から発生する光ベクトルL、3DポイントX、およびポイントXに法線ベクトルNがある場合、ランダムに反射された光線を計算するにはどうすればよいですか?

ある本で私は彼らがこの方程式を使うと言っている主題について読んでいます:

Wd =(theta、phi)= cos-1(sqrt(rand1)、2 * pi * rand2)ここで、Wdは反射光線であり、rand1とrand2は[0,1]の範囲の乱数です。

これは私にはうまくいきませんでした。その方程式を使用して、球座標をデカルト座標に変換しましたが、これにより、法線の方向に関係なく、光線が常に同じいくつかの方向に反射されるようになりました。

どんな助けでも大歓迎です!

4

2 に答える 2

1

を選択thetaしても、の分布は本来あるべきほど均一ではないarccos(sqrt(rand1))ため、単位球の表面にランダムに分布した点は得られません。arccos(sqrt(rand1))

球座標で2つのランダムな変量uv、から均一にサンプリングされた(0, 1)場合、ランダムな点は次のようになります。

theta = 2*pi * u   <--- note, no arccos here
phi = arccos(2*v - 1)

これは表面からの反射であるため、球面の半分をサンプリングするだけで済みthetaますtheta = pi * u

反射角度はランダムであるため、光源がどこにあるかは実際には重要ではありません。つまり、結果は光ベクトルLに依存しません。サンプリングされた半球が外側になるように、球座標を選択するだけで済みます。表面の側面。

別のオプション:

  1. 単位球全体の表面にランダムな点を描画します(つまりtheta = 2 * pi * u
  2. デカルト点ベクトル座標に変換
  3. 法線と点ベクトルの内積を取ります。負の場合は、手順1から繰り返します。

これにより、表面の外側に面する半球からのみサンプリングすることが保証されます。

球面座標を完全にスキップして、デカルト座標を直接計算することもできます。

x = sqrt(1 - u^2) * cos(theta)
y = sqrt(1 - u^2) * sin(theta)
z = u

ここでuは、から均一にサンプリングされ[-1, 1](たとえばu = 2*v - 1vで均一にサンプリングされます[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)
于 2013-01-23T11:57:32.577 に答える
0

ランバート反射も調べています。提供するコードは機能します。これは、サーフェスの法線ベクトルから参照されるだけです。正しいベクトルを取得するには、次のようにする必要があります。

  1. 表面の法線ベクトルNを、表面の平面内の(任意の)軸を中心に角度phiだけ回転させます。
  2. 結果として得られるベクトルを、サーフェス法線ベクトルを中心に角度シータだけ回転させます。

任意の軸を中心にベクトルを回転させるためのコードは、ここから生成できます:http: //inside.mines.edu/~gmurray/ArbitraryAxisRotation/

于 2013-10-08T18:57:41.673 に答える