0

我正在使用python制作图像。但是朗伯着色不起作用。

起初图像是这样保存的。 在此处输入图像描述

但是当我反转球体的法线向量时,图像就这样保存了。在此处输入图像描述

这是我的着色代码。

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 是最近球体的编号。如果有人可以帮助我,我将不胜感激。我已经这样做了一个星期

4

1 回答 1

0

你没有说出你认为错的地方。与第一张图像中的球体相关的光线在哪里?它在他们的上方和稍后方吗?如果是这样 - 图像看起来正确。假设上面的陈述是正确的,那么第二张图片看起来是正确的。光线位于球体底部的原因是法线现在指向“内”,因此 dot() 乘积符号将与第一张图像中的相反。请注意,在您的示例代码中,您似乎没有进行任何阴影射线处理。换句话说 - 所有对象都将被点亮,就好像所有其他对象都是透明的一样。没有物体会在其他物体上投射阴影。这也解释了为什么当光线从顶部射进来时你可以看到球体的底部。如果你有适当的阴影光线,那么它就不会

于 2019-04-28T23:22:07.953 回答