35.2.1 数学推导
单页双曲面、双页双曲面、椭圆锥面、椭圆柱面。
这四个二次曲面方程共同形式:
但是,注意到,这些曲面都是开放曲面。在画图时,需要限制曲面的范围(以免曲面覆盖整个画面)。
我们在这里是限制曲面在y轴方向距离中心点的长度为height_y(引入该参数)。
所以,我们可以在根据实根t求得交点坐标后,对交点坐标作如下判断:
((rec.p.y()-center.y()) >-height_half_y) && ((rec.p.y()-center.y()) < height_half_y)
这里,要特别注意:
之前,球面的处理方式是:
所以,其一:我们需要对两个实根进行排序(先处理小的)
另外,由于,是开放曲面,也就是,光线有可能撞击到曲面的正反两面,所以,对于撞击点处的标准化之后的法向量,我们需要做如下判断:
if (dot(rec.normal,r.direction()) > 0) {
rec.normal =-rec.normal;
}//(法向量决定着反射光线和折射光线