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