球体将作为我们的光线追踪渲染器渲染的第一个物体,因为球体在数学表达上更简洁,同时在计算光线和球体碰撞时也很简单。

球体的定义十分简单,距离球心 $C$ 距离为 $r$ 的点的集合即为球体,例如当 $C$ 为坐标原点时,球体的定义如下:
$$ x^2 + y^2 + z^2 = r^2 \tag{1} $$
球体的一般定义为:
$$ (C_x - x)^2 + (C_y-y)^2+(C_z-z)^2 = r^2 \tag{2} $$
如果一个给定点 $(x,y,z)$ 在球的表面上,则有 $x^2 + y^2 +z^2 = r^2$。
如果一个给定点 $(x,y,z)$ 在球内,则有 $x^2 + y^2 +z^2 \lt r^2$。
如果一个给定点 $(x,y,z)$ 在球外,则有 $x^2 + y^2 +z^2 \gt r^2$。
为了方便处理,我们希望将球体的公式用向量来表达,我们将球心定义为 $C = (C_x, C_y, C_z)$ ,任意点定义为 $P = (x, y, z)$ ,故可以获得一个用向量表达的定义:
$$ (C-P)\cdot(C-P) = (C_x-x)^2 + (C_y-y)^2 + (C_z-z)^2 \tag{3} $$
$$ (C-P)\cdot(C-P)= r^2 \tag{4} $$
其中 $C - P$ 即为球心 $C$ 到点 $P$ 的距离向量。
我们定义射线的方程为 $P(t) = Q + td$ ,如果射线经过了球,则一定存在值 $t$ 可以使得下式成立:
$$ (C - P(t))\cdot(C-P(t)) = r^2 \tag{5} $$
求射线与球体有交点的问题因此转化为求该方程是否有 $t \ge 0$ 的实数解。