阿昌学习《RayTraing in one week》 (五)
第五章
这第五章主要是加入了曲面法线和多个物体。
曲面法线:就是垂直于一个曲面的向量;(作者在里提到说是否用单位法向量是属于个人爱好)
对于球体来说,法线就是光线与球的焦点减去球心

接下来我们将这个法线可视化,法线就是个vec3,我们就把这个vec3转化颜色的数值,这里要注意的是法向量取值是(-1,1),颜色是(0,1),那么可以(x+1,y+1,z+1)*0.5,这样就可以转成颜色的rgb了。
那么我们将原来的代码修改一下:

得到下边的法线图:

接下来我们要给我们的场景添加多个物体了,原本可以直接添加另一个物体,但我们直接选择优化一下,创建一个物体的抽象类,来让物体继承这个抽象类,只要这个物体和光线有交点那么就继承它,既然是有相交的物体,那么这个抽象类就叫hitable好了。
根据一元二次方程组求解以及光线方程,我们知道光线如果和物体有交点,那么t就会有一个取值范围 t_min < t < t_max ,这样就可以计算出那一个交点离我们更近。
先添加一下抽象类:

接下来写一个继承hitable的球类sphere:

有了一个比较完整的物体球类,再写一个列表,方便存储多个对象:

同样的main也进行修改,原来的hit_sphere就可以删除了,新的main.cpp

运行之后的得到的就是下边这个图了,绿色的部分就是新加的大球

下一章要添加抗锯齿了,这样就可以让图片更有feel了。