Reflection 计算漫反射(朗伯反射)

Reflection 计算漫反射(朗伯反射),reflection,graphics,vector,normalization,physics,Reflection,Graphics,Vector,Normalization,Physics,我需要帮助弄清楚如何计算(朗伯)漫反射——也就是光线击中表面,然后沿随机方向反弹。如果我有一个源于光源的光向量L,一个3D点X和一个法向量N在点X,我如何计算一个随机反射的光线 在我读的一本书中,他们说使用这个等式: Wd=(θ,φ)=cos-1(sqrt(rand1),2*pi*rand2),其中Wd是反射光线,rand1和rand2是范围[0,1]内的随机数 这对我不起作用。我使用这个方程,然后将球坐标转换成笛卡尔坐标,但这使得光线总是在相同的几个方向上反射,而不管法线的方向如何 感谢您的帮

我需要帮助弄清楚如何计算(朗伯)漫反射——也就是光线击中表面,然后沿随机方向反弹。如果我有一个源于光源的光向量L,一个3D点X和一个法向量N在点X,我如何计算一个随机反射的光线

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

Wd=(θ,φ)=cos-1(sqrt(rand1),2*pi*rand2),其中Wd是反射光线,rand1和rand2是范围[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)
这里,
u
[-1,1]
中均匀取样(例如,
u=2*v-1
,其中
v
[0,1]
中均匀取样),而
theta
[0,2*pi]中均匀取样

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

[-1,1]
中均匀取样
x1
x2
。如果
x1^2+x2^2<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)
这里,
u
[-1,1]
中均匀取样(例如,
u=2*v-1
,其中
v
[0,1]
中均匀取样),而
theta
[0,2*pi]中均匀取样

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

[-1,1]
中均匀取样
x1
x2
。如果
x1^2+x2^2<1
,则(如果不是,重复取样):


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

  • 将曲面法向量N围绕曲面平面中的(任意)轴旋转角度φ
  • 将生成的向量围绕曲面法向量旋转角度θ
  • 关于任意轴的旋转矢量的代码可以从这里生成:

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

  • 将曲面法向量N围绕曲面平面中的(任意)轴旋转角度φ
  • 将生成的向量围绕曲面法向量旋转角度θ
  • 关于任意轴的旋转矢量的代码可以从这里生成:

    非常感谢!这是非常有用的信息。我刚才有点困惑,为什么我正在读的那本书(是亨里克·万恩·詹森的光子映射指南)推荐公式(θ,φ)=(cos-1(sqrt(rand1),2*pi*rand2)如果这个等式是假的。对不起,我没有那本书。可能是打字错误,或者你可能用我无法理解的方式转录了公式。非常感谢!这是非常有用的信息。我刚才有点困惑我为什么要读那本书(那是亨里克·万恩·詹森的光子映射指南)如果方程是假的,推荐方程(θ,φ)=(cos-1(sqrt(rand1),2*pi*rand2)。对不起,我没有那本书。可能是打字错误,或者你可能以我无法理解的方式转录了公式。
    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)