4

我正在为一个大型项目开发光线追踪器,目标是在不担心 CPU 时间的情况下生成逼真的渲染。基本上是预渲染,所以我要追求准确性而不是速度。

我在理解事物照明方面的一些更高级的数学时遇到了一些麻烦。基本上,我的观点是有道理的。假设没有距离衰减,我应该能够使用我找到的多边形上的点,并将该点的法线与光线的入射角进行比较,以计算出我的照明值。因此,给定平面上的一个点、该平面的法线和点光源,我将如何计算出该角度?

我问的原因是我似乎找不到任何关于找到入射角的参考。我可以找到很多参考资料,详细说明一旦获得它该怎么做,但没有告诉我如何首先获得它。我想这很简单,但我无法将其逻辑化。

谢谢

4

3 回答 3

8

如果您已经对向量进行了归一化,则表面法线向量和入射光向量的点积将为您提供入射角的余弦值。

于 2009-02-20T18:35:31.747 回答
0

注意:从我现在坐的地方,我无法为您上传图片。不过,我会尝试用文字为您说明。

以下是您可以想象的这个过程:

将alt 文本 http://www.yourequations.com/eq.latex?%5Chat%7Bn%7D定义为标准化法线(来自平面多边形的垂直向量,具有单位长度,使数学更容易)。

将替代文本 http://www.yourequations.com/eq.latex?p_0定义为您的眼球。

将替代文本 http://www.yourequations.com/eq.latex?p_1定义为“眼球射线”在多边形上的影响点。

将替代文本 http://www.yourequations.com/eq.latex?%5Chat%7Bv%7D定义为从替代文本 http://www.yourequations.com/eq.latex?p_1指向替代文本的归一化向量http://www.yourequations.com/eq.latex?p_0。你可以这样写:

替代文字 http://www.yourequations.com/eq.latex?%5Chat%7Bv%7D%20=%20%5Cfrac%7B%5Coverrightarrow%7B(p_0%20-%20p_1)%7D%7D%7B| |p_0%20-%20p_1||%7D

因此,您创建了一个从alt 文本 http://www.yourequations.com/eq.latex?p_1指向alt 文本 http://www.yourequations.com/eq.latex?p_0的向量,然后分割该向量通过它自己的长度,给你一个长度为 1 的向量,它从alt 文本 http://www.yourequations.com/eq.latex?p_1指向alt 文本 http://www.yourequations.com/eq.latex?p_0

我们遇到所有这些麻烦的原因是我们真的想要角度替代文本 http://www.yourequations.com/eq.latex?%5Ctheta这是正常替代文本 http://www 之间的角度。 yourequations.com/eq.latex?%5Chat%7Bn%7D和您刚刚创建的矢量替代文本 http://www.yourequations.com/eq.latex?%5Chat%7Bv%7D 。theta 的另一个词是入射角

计算这个入射角的一个简单方法是使用点积。使用上面定义的术语,您获取每个单位长度向量的 x、y 和 z 分量,将它们相乘并相加得到点积。

替代文字 http://www.yourequations.com/eq.latex?%5Chat%7Bn%7D%20%5Ccdot%20%5Chat%7Bv%7D%20=%20%5Ccos%7B%5Ctheta%7D%20= %20n_x%20%20v_x%20+%20n_y%20%20v_y%20+%20n_z%20%20v_z

因此,要计算替代文本 http://www.yourequations.com/eq.latex?%5Ctheta,您只需在点积上使用反余弦:

替代文字 http://www.yourequations.com/eq.latex?%5Ctheta%20=%20%5Carccos%28%5Chat%7Bn%7D%20%5Ccdot%20%5Chat%7Bv%7D%29

编辑:修改以上内容以添加yourequations.com格式。

于 2009-02-20T19:02:05.803 回答