计算漫反射(朗伯)反射

时间:2013-01-23 10:04:48

标签: reflection graphics vector normalization physics

我需要帮助弄清楚如何计算(朗伯)漫反射 - 即当光线照射到表面然后以随机方向反弹时。因此,如果我有一个源自光源的光矢量L,一个3D点X和一个X点的法向量N,我该如何计算一个随机反射的光线呢?

在一本书中,我正在阅读他们所说的使用这个等式的主题:

Wd =(theta,phi)= cos-1(sqrt(rand1),2 * pi * rand2)其中Wd是反射光线,rand1和rand2是[0,1]范围内的随机数。 / p>

这对我不起作用。我使用了这个方程,然后将球面坐标转换为笛卡尔坐标,但这使得光线总是在相同的几个方向上反射,而不管法线的方向。

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

选择thetaarccos(sqrt(rand1))不会在单位球体的表面上为您提供随机分布的点,因为arccos(sqrt(rand1))的分布无论如何都是均匀的。

给定两个随机变量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开始重复。
  4. 这样可以保证您只从面向表面外侧的半球进行采样。

    您也可以完全跳过球面坐标并直接计算笛卡尔坐标:

    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)

    还有另一种方法根本不使用三角函数(取自here):

    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)
    

答案 1 :(得分:0)

我也在研究朗伯反射,你提供的代码确实有效,它只是从表面的法向矢量引用。要获得正确的向量,您应该:

  1. 将表面法线向量N绕表面平面中的(任意)轴旋转角度phi
  2. 将关于表面法向量的结果向量旋转角度θ
  3. 可以从这里生成关于任意轴的旋转矢量的代码: http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/