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