如何解决光线追踪中的反光问题?

时间:2019-04-16 01:54:01

标签: raytracing shading

我正在使用python制作图像。但是Lambertian阴影无效。

首先,图像保存如下。 enter image description here

但是当我反转球体的法线向量时,图像就这样保存。enter image description here

这是我的着色代码。

v = -m*ray

if s == 'Sphere':
    n = view.viewPoint - list[idx].c - v
    n =  -n / np.sqrt(np.sum(n*n))

for i in light:
    l_i = v + i.position - view.viewPoint
    l_i = l_i / np.sqrt(np.sum(l_i * l_i))

 x = list[idx].s.d[0] * i.intensity[0] * max(np.dot(l_i, n), 0)
 y = list[idx].s.d[1] * i.intensity[1] * max(np.dot(l_i, n), 0)
 z = list[idx].s.d[2] * i.intensity[2] * max(np.dot(l_i, n), 0)

list是球体的列表,而idx是最接近球体的编号。 如果有人可以帮助我,我将不胜感激。我已经做了一个星期了

1 个答案:

答案 0 :(得分:0)

您尚未说明您认为错误的地方。 与第一张图片中的球体有关的光线在哪里?是在它们之上并在其后方吗?如果是这样-图像看起来正确。 假设上面的陈述是正确的,则第二张图像看起来正确。光线位于球体底部的原因是因为法线现在指向“中”,因此dot()乘积符号将与第一个图像中的符号相反。 请注意,在您的示例代码中,看起来没有任何阴影射线处理。换句话说,所有对象都将被照亮,就像其他所有对象都是透明的一样。没有对象将阴影投射到其他对象上。这也解释了为什么当光线来自顶部时可以看到球体的底部。如果您有适当的阴影光线,那么法线指向的方向实际上并不重要(我将在该点移除max()函数)。