我需要帮助弄清楚如何计算(朗伯)漫反射 - 即当光线照射到表面然后以随机方向反弹时。因此,如果我有一个源自光源的光矢量L,一个3D点X和一个X点的法向量N,我该如何计算一个随机反射的光线呢?
在一本书中,我正在阅读他们所说的使用这个等式的主题:
Wd =(theta,phi)= cos-1(sqrt(rand1),2 * pi * rand2)其中Wd是反射光线,rand1和rand2是[0,1]范围内的随机数。 / p>
这对我不起作用。我使用了这个方程,然后将球面坐标转换为笛卡尔坐标,但这使得光线总是在相同的几个方向上反射,而不管法线的方向。
感谢任何帮助!
答案 0 :(得分:1)
选择theta
为arccos(sqrt(rand1))
不会在单位球体的表面上为您提供随机分布的点,因为arccos(sqrt(rand1))
的分布无论如何都是均匀的。
给定两个随机变量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
)这样可以保证您只从面向表面外侧的半球进行采样。
您也可以完全跳过球面坐标并直接计算笛卡尔坐标:
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)
。
还有另一种方法根本不使用三角函数(取自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)
我也在研究朗伯反射,你提供的代码确实有效,它只是从表面的法向矢量引用。要获得正确的向量,您应该:
可以从这里生成关于任意轴的旋转矢量的代码: http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/