PBRT中Ray–Bounds Intersections的理解

本文深入解析了Ray与BoundingBox相交的算法原理,详细介绍了如何通过计算Ray与BoundingBox的8个slaps(即与各边相交的平面)来判断二者是否相交。文章通过数学公式和几何直观解释了这一过程,特别强调了通过比较tNear和tFar来快速排除不可能相交的情况,提供了一种高效检测Ray与3D模型碰撞的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

slaps in bounding box的解释:

bounding box有8个点,每个点可以看成是3个slaps的intersection,

那么一个slap就可以是一个平面,其方程是:

ax+ by + cz + d=0

把ray的表达式代入平面方程得到:

a(o_x + td_x) + b(o_y + td_y) + c(o_z + td_z) + d=0

解方程得t:

t=\frac{-d-((a,b,c)\cdot o)}{(a,b,c)\cdot d}

由于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)为例子,其方程是:

d_x + d = 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。

所以有:

t=\frac{-d-((1,0,0)\cdot (o_x,o_y,o_z))}{(1,0,0)\cdot (d_x,d_y,d_z)}

t_0 = \frac{x_0-o_x}{d_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。

 

参考:

pbr-book 3.1.2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值