您的位置:首页 > 其它

Ray Box求交点

2015-10-12 22:15 218 查看
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]−→−−−−,delta−→−−⋅Axis[Z]−→−−−−)

Axis[X]−→−−−−⇒Axis[X]−→−−−− ′=(1,0,0)

Axis[Y]−→−−−−⇒Axis[Y]−→−−−− ′=(0,1,0)

Axis[Z]−→−−−−⇒Axis[Z]−→−−−− ′=(0,0,1)

t⇒t ′=d−O ′∗ni→ ′ni→ ′⋅dir→ ′

我们以Box的左右平行平面空间为例:

nleft−→− ′=−Axis[X]−→−−−− ′=(−1,0,0)

nright−→−− ′=Axis[X]−→−−−− ′=(1,0,0)

leftplane:P⋅nleft−→− ′=e0=−P.x

rightplane:P⋅nright−→−− ′=e0=P.x

tleft ′=e0+delta−→−⋅Axis[X]−→−−−dir→⋅Axis[X]−→−−=−e0−delta−→−⋅Axis[X]−→−−dir→⋅Axis[X]−→−−

tright ′=e0−delta−→−⋅Axis[X]−→−−dir→⋅Axis[X]−→−−=−e0+delta−→−⋅Axis[X]−→−−−dir→⋅Axis[X]−→−−

同理可得:

tbottom ′=e1+delta−→−⋅Axis[Y]−→−−−dir→⋅Axis[Y]−→−−=−e1−delta−→−⋅Axis[Y]−→−−dir→⋅Axis[Y]−→−−

tup ′=e1−delta−→−⋅Axis[Y]−→−−dir→⋅Axis[Y]−→−−=−e1+delta−→−⋅Axis[Y]−→−−−dir→⋅Axis[Y]−→−−

tback ′=e2+delta−→−⋅Axis[Z]−→−−−dir→⋅Axis[Z]−→−−=−e2−delta−→−⋅Axis[Z]−→−−dir→⋅Axis[Z]−→−−

tfront ′=e2−delta−→−⋅Axis[Z]−→−−dir→⋅Axis[Z]−→−−=−e2+delta−→−⋅Axis[Z]−→−−−dir→⋅Axis[Z]−→−−

进入slab时各入口的最大值,离开slab时各出口的最小值,即为相交区间,那么进入slab和离开slab如何用数学公式来描述呢?



如图所示,若ray从某平面进入slab,则ray与该平面的法线夹角必定大于90度(向量点积小于0),因此,若ray从某平面离开slab,则ray与该平面法线的夹角必定小于90度(向量点积大于0)

以Box的左右平面组成的slab为例:

rightplane的法线为Axis[X]−→−−−−

若Axis[X]−→−−−−⋅dir−→<0 , 则说明光线从rightplane进入slab

∵tright ′=−e0+delta−→−⋅Axis[X]−→−−−dir→⋅Axis[X]−→−−

∴假如tright的分母大于0,说明ray从rightplane进入slab

假如tright的分母小于0,说明ray从rightplane离开slab

同理可知,当t的分母小于0,说明ray从该平面离开slab,若大于,则进入

当t的分母等于0,说明ray与该平面平行(与面法线的角度为90度),该情况下,若分子大于0,则说明ray在box外部,否则反之。如以tleft为例:

if −e0−delta−→−−⋅Axis[X]−→−−−−>0

then delta−→−−⋅Axis[X]−→−−−−<−e0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: