首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算漫反射(朗伯反射)

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

Stack Overflow用户
提问于 2013-01-23 18:04:48
回答 2查看 2.9K关注 0票数 1

我需要帮助找出如何计算(朗伯)漫反射-即当光线击中表面,然后以随机方向反弹。因此,如果我有一个来自光源的光向量L,一个三维点X和一个点X处的法向量N,我如何计算随机反射的光线?

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

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

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

如有任何帮助,我们不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-23 19:57:33

选择theta作为arccos(sqrt(rand1))不会在单位球体的表面上给出随机分布点,因为arccos(sqrt(rand1))的分布并不像它应该的那样均匀。

给定从(0, 1)均匀采样的两个随机变量uv,在球坐标中,随机点为:

代码语言:javascript
复制
theta = 2*pi * u   <--- note, no arccos here
phi = arccos(2*v - 1)

因为它是一个表面的反射,你只需要对球面的一半进行采样,所以theta更愿意是theta = pi * u

由于反射角度是随机的,因此光源的位置并不重要,即结果不依赖于光矢量L。您只需选择球面坐标,以便采样的半球位于曲面的外侧。

另一种选择:

在整个单位球体的表面上绘制一个随机点(即theta = 2 * pi * u)

  • Convert to Cartesian point coordinates

  • Take
  1. 法线和点向量的点积)。如果是否定的,请从第1步开始重复。

这将确保您仅从面对曲面外侧的半球进行采样。

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

代码语言:javascript
复制
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]均匀采样的x1x2为例。如果为x1^2 + x2^2 < 1,则(如果不为,请重复采样):

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-10-09 02:57:42

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

将曲面法向量N在曲面平面内绕(任意)轴旋转φ

  • 将生成的向量绕曲面法向量旋转角度θ

可以从以下位置生成绕任意轴旋转矢量的代码:http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14476973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档