1

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

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

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

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

任何帮助表示赞赏!

4

2 回答 2

1

选择thetabearccos(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 开始重复。

这将保证您只从面向表面外侧的半球采样。

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

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)

还有另一种完全不使用三角函数的方法(取自此处):

从 中取x1x2均匀采样[-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. 将结果向量围绕表面法线向量旋转角度 theta

可以从这里生成关于任意轴旋转矢量的代码:http: //inside.mines.edu/~gmurray/ArbitraryAxisRotation/

于 2013-10-08T18:57:41.673 回答