本文已参与[新人创作礼]活动,一起开启掘金创作之路
转载请注明出处.
图形学的数学基础(二十二):AABB与光线求交
包围盒常用来做物体的碰撞监测,光线的相交测试等。尤其在光线追踪中,包围盒常用来做光线与物体相交测试。基本思想是这样的,我们将包围盒的长方体看做是三对互相平行的平面相交所形成的区域。尤其对于AABB,每一对平行面都是与一个轴对齐的。根据这个特性,先以二维空间举例:

AABB由两对平面构成,分别是平行于x轴和y轴。根据光线公式可知:
Ray=0+dt
其中o为光线起点,d为光线方向,Ray是光线经过t时间到达的位置。
如何判定光线是否与包围盒相交呢?我们可以通过分解,将问题简化,将光线分别穿过每对无线延申的平面,分别求出其Tmin和Tmax:
与x轴垂直的一对平面的交点:

Txmindx+ox=x0
=>
Txmin=dxx0−ox
Txmaxdx+ox=x1
=>
txmax=dxx1−ox
与y轴垂直的一对平面的交点:

Tymindy+oy=y0
=>
Tymin=dyy0−oy
Tymaxdy+oy=y1
=>
tymax=dyy1−oy
现在我们想象空间中的一条光线,只有当光线进入了所有的“平面对”,才算进入了盒子,光线只要离开了任何“平面对”,就算离开了盒子,因此光线进入盒子的时间实际上是进入所有“平面对”的最大值,即最小时间的最大值,而离开盒子的时间是光线离开“平面对”的最小值,即最大时间的最小值。(求交)

考虑三维情况下光线与AABB求交。关键点:
- 当且仅当光线进入了所有“平面对”,光线进入盒子。
- 只要光线离开了一组“平面对”,光线就离开了盒子。
对于三维空间,我们有三组“平面对”,分别计算tmin和tmax,因此有:
tenter=max(tminx,tminy,tminz)
texit=min(tmaxx,tmaxy,tmaxz)
当且仅当tenter<texit时,我们认为“光线在盒子里停留了一段时间”,即光线与盒子相交。
但是以上推断没有考虑t为负值的情况,当texit<0时,盒子在光线背面,必然不会出现交点(光线是单向的),当 texit>=0并且tenter<0时,光线起点在盒子里边,那么光线必然与盒子相交。因此得出结论:
光线Ray与AABB相交,当且仅当:
tenter<texit
texit>=0
参考
《3D数学基础》图形和游戏开发(第二版)
GAMES101 -现代计算机图形学入门-闫令琪