我正在用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是最近球体的编号。如果有人能帮我,我将不胜感激。我已经这样做了一周了
发布于 2019-04-28 23:22:08
你还没有陈述你认为错误的地方。在第一张图像中,灯光与球体的关系在哪里?它是在它们的上方和后面吗?如果是这样-图像看起来是正确的。假设上面的陈述是正确的,那么第二个图像看起来是正确的。灯光位于球体底部的原因是因为法线现在指向" in“,因此点()乘积符号将与第一张图像中的符号相反。请注意,在您的示例代码中,看起来没有任何阴影光线处理。换句话说-所有对象都将被照亮,就像所有其他对象都是透明的一样。没有对象会将阴影投射到其他对象上。这也解释了为什么当光线来自顶部时,您可以看到球体的底部。如果你有合适的阴影光线,那么法线指向哪个方向实际上并不重要(我会在这一点上删除max()函数)。
https://stackoverflow.com/questions/55699478
复制相似问题