Ray Box求交点
2015-10-12 22:15
218 查看
Ray与Box的定义:
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如何用数学公式来描述呢?
![](https://img-blog.csdn.net/20151012214927355)
如图所示,若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
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
相关文章推荐
- 2015-10-12
- 游戏系统开发笔记(八)——场景对象管理
- 游戏系统开发笔记(七)——对象系统设计
- windows下 简单配置PHP + apache +mysql
- 【读图学C语言】编译时发生了什么?
- Oracle笔记 六、PL/SQL简单语句块、变量定义
- Oracle笔记 七、PL/SQL 异常处理
- mybatis0206 延迟加载
- android画文本
- spring读写分离 - 事务注解篇
- 多项式方面的应用(多项式用结构体来实现)
- php数组
- linux的OPEN系统调用
- Oracle笔记 五、创建表、约束、视图、索引、序列、同义词、表空间
- db2上新建表空间和数据库
- nyoj 士兵杀敌(二) 116 (线段树模板)
- 两个有意思的逻辑分析案例
- 两个有意思的逻辑分析案例
- 游戏系统开发笔记(六)——服务端架构设计
- 游戏系统开发笔记(五)——服务端系统分层