首先,让我们制作一个发光的材料。我们需要一个发光函数(我们也可以把它加到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)亮。这使得它足够亮,可以照亮物体。

        也可以做一些球形灯。

    

posted on 2018-07-23 11:23  图样司  阅读(223)  评论(0编辑  收藏  举报