阿昌学习《RayTraing in one week》 (四)
上一章加入了摄像机和背景,这样的就有个场景的模样,现在再往这个场景里添加一个物体,而选择添加的物体就是球体,因为球体在计算光线是否击中的时候比较好计算。
首先是我们上学的时候学过球表面的一个方程
X² + Y² + Z² = R²,这样呢就可以有两个判断
X² + Y² + Z² > R²,这就说明这个点在球外
X² + Y² + Z² < R²,这个就是在球内部
我们设球的圆心是(CX,CY,CZ)
那么我们的公式就变成(X - CX)² + (Y - CY)² +(Z - CZ)² = R²
现在球上一个点P(X,Y,Z)到圆心C的距离 也就是半径呢 就可以表示成(P-C)
那么上边的公式就变成
(X - CX)² + (Y - CY)² +(Z - CZ)² = (P-C) * (P-C)
(P-C) * (P-C) = R²
上一章中的光线方程 p(t) = a + t * b,把这个公式带入
(a + t * b-C) * (a + t * b-C) = R²
因为t是一个未知数,不难看出 这就是一个一元二次方程,那就可以整理成下边这样
t²b² + 2tb*(a-C)+(a-C)*(a-C)-R² = 0

那么一元二次方程组我们就很容易解啦

来自百度百科截图,一元二次方程组的求根公式
接下来添加一个球体,并且赋予红色。

运行之后就得到下边这个了。
