我需要帮助找出如何计算(朗伯)漫反射-即当光线击中表面,然后以随机方向反弹。因此,如果我有一个来自光源的光向量L,一个三维点X和一个点X处的法向量N,我如何计算随机反射的光线?
在我读的一本书中,他们说使用这个等式:
Wd =(θ,φ)= cos-1(sqrt( rand1 ),2*pi* rand2 ),其中Wd是反射射线,rand1和rand2是0,1范围内的随机数。
这对我不起作用。我使用了这个方程,然后将球面坐标转换为笛卡尔坐标,但这使得光线总是在相同的几个方向上反射,而不管法线的方向。
如有任何帮助,我们不胜感激!
发布于 2013-01-23 19:57:33
选择theta作为arccos(sqrt(rand1))不会在单位球体的表面上给出随机分布点,因为arccos(sqrt(rand1))的分布并不像它应该的那样均匀。
给定从(0, 1)均匀采样的两个随机变量u和v,在球坐标中,随机点为:
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):
以从[-1, 1]均匀采样的x1和x2为例。如果为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-10-09 02:57:42
我也在研究Lambertian反射,您提供的代码确实有效,它只是从曲面的法向量引用。要获得正确的向量,您应该:
将曲面法向量N在曲面平面内绕(任意)轴旋转φ
可以从以下位置生成绕任意轴旋转矢量的代码:http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/
https://stackoverflow.com/questions/14476973
复制相似问题