Ray与Box的定义:
class Ray
{
// data member
Vector3f Origin;
Vector3f Direction;
}
class Box
{
// data member
Vector3f Center;
float Extents[3];
Vector3f Axis[3];
}
Box可以看成由三组平面所构成的平行平面空间(slab)的交集
Ray与Box相交等同于Ray与三个slab都存在交集
Ray使用参数方程表示:
P(t)=O+t∗dir−→
Slab表示为:
P∗ni→=d
∴t=d−O∗ni→ni→⋅dir→
为了计算方便,将OBB转换为AABB,将Ray投影到AABB的三个轴上,从而将Ray转换到以Box的Center为原点,三个Axis为坐标轴的空间里
设置以下记号:
Ray.Direction−→−−−−−−−−−−⇒dir−→
Ray.Origin⇒O
Box.Axis[i]−→−−−−−−−⇒Axis[i]−→−−−
Box.Extent[i]⇒ei
Box.Center⇒C
delta−→−−=O−C
变换后:
dir−→⇒dir−→ ′=(dir−→⋅Axis[X]−→−−−−,dir−→⋅Axis[Y]−→−−−−,dir−→⋅Axis[Z]−→−−−−)
O⇒O ′=(delta−→−−⋅Axis[X]−→−−−−,delta−→−−⋅Axis[Y]−→