首先,让我们制作一个发光的材料。我们需要一个发光函数(我们也可以把它加到hit_record里,这取决于你的设计品位).就像背景,它只告诉光线它是什么颜色,它不反射。这很简单:
这样我就不必让所有非发射材料实现emit(),然后我的基类返回黑色:
接下来,我们将颜色函数中的背景设为黑色,并注意emmit:
现在,我们做一些矩形。矩形通常可以方便地建模人造环境。我很喜欢做等腰矩形,因为它们很简单。(我们会讲到实例化之后再旋转它们).
首先,这里有一个xy平面的矩形。这样一个平面由它的z值定义。例如,z = k。一个轴向的矩形由x=x0、x=x1、y=y0、y=y1几行定义。
要确定一条光线是否击中这个矩形,我们得先确认光线击中这个平面的位置,回想一下,光线p (t) = a + t*b的z分量由z(t) = az + t*bz定义。重新排列这些项我们可以解出z=k时的t。
t = (k-az) / bz
一旦我们有了t,我们就可以把它代入x和y的方程:
x = ax + t*bx
y = ay + t*by
如果x0 < x < x1,而y0 < y < y1,则是命中的。
矩形方程如下:
撞击函数如下:
如果我们设置一个矩形光源:
我们可以得到下图:
注意光线比(1,1,1)亮。这使得它足够亮,可以照亮物体。
也可以做一些球形灯。
原文:https://www.cnblogs.com/TooYoungTsukasa/p/9353727.html