天天看點

PBRT中Ray–Bounds Intersections的了解

slaps in bounding box的解釋:

bounding box有8個點,每個點可以看成是3個slaps的intersection,

那麼一個slap就可以是一個平面,其方程是:

PBRT中Ray–Bounds Intersections的了解

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

PBRT中Ray–Bounds Intersections的了解

解方程得t:

PBRT中Ray–Bounds Intersections的了解

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

PBRT中Ray–Bounds Intersections的了解

平面方程可以看成所有投影到穿過原點的平面法線的距離相等的點的集合。

PBRT中Ray–Bounds Intersections的了解

如上圖,紅點為同時穿過原點的法線和平面的交點。法線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。

是以有:

PBRT中Ray–Bounds Intersections的了解
PBRT中Ray–Bounds Intersections的了解

                公式(1)

那麼算法可以簡單地三個方向的min和max兩個平面分别求出tNear和tFar,隻要tNear > tFar,檢測傳回失敗。

PBRT中Ray–Bounds Intersections的了解

如圖,如果一個ray經過box,那麼x方向的slap和y方向的slap必然有交集。

而交集是否存在的判斷隻需要滿足下面的不等式:

max(xNear, yNear, zNear) < min(xFar, yFar, zFar)。

下面以一個例子說明為何不相交:

PBRT中Ray–Bounds Intersections的了解

從圖中可以看到:

按照公式(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

繼續閱讀