slaps in bounding box的解释:
bounding box有8个点,每个点可以看成是3个slaps的intersection,
那么一个slap就可以是一个平面,其方程是:
把ray的表达式代入平面方程得到:
解方程得t:
由于bounding box的每个slap分别是和x,y,z轴垂直的三个平面,
(a,b,c)分别是(1,0,0), (0,1,0), (0,0,1)。
以经过bounding box的pMin垂直于x轴的平面(a, b, c) = (1, 0, 0)为例子,其方程是:
平面方程可以看成所有投影到穿过原点的平面法线的距离相等的点的集合。
如上图,红点为同时穿过原点的法线和平面的交点。法线n是(a, b, c)。
空间上一点(x, y, z)和法线(a, b, c)点乘就是原点到红点的距离-d。
ax + by + cz = (a, b, c) · (x, y, z) = -d
那么垂直x轴经过pMin的平面的-d值是pMin.x。
所以有:
公式(1)
那么算法可以简单地三个方向的min和max两个平面分别求出tNear和tFar,只要tNear > tFar,检测返回失败。
如图,如果一个ray经过box,那么x方向的slap和y方向的slap必然有交集。
而交集是否存在的判断只需要满足下面的不等式:
max(xNear, yNear, zNear) < min(xFar, yFar, zFar)。
下面以一个例子说明为何不相交:
从图中可以看到:
按照公式(1)
tNear = (pMin.y - ray.o.y) / d.y;
tFar = (pMax.y - ray.o.y) / d.y;
tNear > tFar,因此相交检查返回failure。
参考: