chapter 4:添加一个球体

chapter 4:添加一个球体

文章翻译

  让我们一起给光线追踪器添加一个简单的物体,人们经常在光线追踪中使用球体,因为计算光线是否击中球体是非常简单的。回忆一下球体中心在原点且半径为R的方程式,x * x + y * y + z * z = R * R. 你所读到的方程对任何的(x,y,z)都适用,如果这个等式成立,则点在球体上,否则点就不在球体上,如果球体中心在(cx,cy,cz),则方程式就变得难看: (x-cx) * (x-cx) + (y-cy) * (y-cy) + (z-cz) * (z-cz)= R * R
  在图形学中,你几乎总是想让你的公式用向量的形式表达,因此所有的x/y/z都在 class vec3 。你或许可以这样表示,从中心 C = (cx,cy,cz) 到点 p = (x,y,z) 的向量是 (p - C). 并且点积可以这样表示, ((p - C),(p - C)) = (x-cx)(x-cx) + (y-cy)(y-cy) + (z-cz)*(z-cz) ,因此球体方程的向量表达形式是: dot((p - c),(p - c)) = R * R
  你可以认为满足这个方程的任何点都在球体上,我们想知道我们的光线 p(t) = A + tB* 是否击中球体的任意位置。如果有击中球体,则有某项 t 能使 p(t) 满足球体方程,因此我们寻求能使这个方程成立的所有 tdot((p(t) - c),(p(t) - c)) = R * R ,将 p(t) 的形式展开得: dot((A + tB - C),(A + tB - C)) = R*R
  向量代数得规则在这里是我们想要得,如果我们将公式扩展并把所有参数移到等号左边,我们可以得到: t * t * dot(B,B) + 2 * t * dot(B,A-C) + dot(A-C,A-C) - R*R = 0
  在等式中得向量和R都是常量,这是我们所知道的。未知数是 t,并且等式是二次的,就如你在高中数学课上所见的那样。你可以解出 t,平方根部分解出来可能两个都是正数(意味着两个真实解),两个都是负数(意味着没有真实解)或者为零(意味着有一个真实解)。在图形学中,代数几乎总是和几何有着非常直接的联系。我们可以得到如下:
chapter 4:添加一个球体
  如果我们使用这个数学公式并把它写入我们的程序里,我们可以通过将与放置在z轴-1位置的小球相交的像素点设置为红色来测试这段代码:
chapter 4:添加一个球体
  我们可以得到:
chapter 4:添加一个球体
  现在这个程序还缺少各种各样的东西——像阴影效果,光线反射,以及许多个物体——但是与刚开始相比,我们已经做了近一半!值得注意的事情是,我们要测试光线是否一直击中球体,而 t < 0 部分的解也起了作用。如果你改变你的球体中心到z轴+1位置,实际上,你将得到相同的图片,因为你看到了在你身后的物体。这不是一个合理的功能!我们接下来会修复这个问题。

  设置判断球体是否击中的函数,如果击中则设置像素点颜色为红色,否则还是背景色

上一篇:【密码学复习】【Chapter 2】【完美保密】


下一篇:chapter 2 分支结构