Ray Box 碰撞检测

来源:互联网 发布:妈妈漂亮知乎 编辑:程序博客网 时间:2024/05/21 09:28

Box采用OBB定义:

enum AxisDefine{    X ,     Y ,     Z};// data member Vector3f Center;Vector3f Axis[3];float extent[3];    // 边长的一半

Ray采用参数式Point=Origin+tDirection,0t

// dataVector3f Origin;Vector3f Direction;

Ray.OriginO
Ray.DirectionDir
Box.CenterC
Box.Extent[i]ei
Box.Axis[i]Axis[i]

采用分离轴方法来进行碰撞检测:
一:首先我们使用Box的面法线(即坐标轴)Aixs[i]作为分离轴
这里写图片描述
在这种情况下Box在分离轴上的投影即为该轴向的边

计算光线起点在分离轴上的投影:

delta=OC=CO
ProRay=deltaAxis[i]

Box在分离轴上的投影为:
eiProBoxei

当满足如下两种情况:

  1. ProRay>eiDirAxis[i]0(即光线方向与分离轴的方向范围为(90,90)
  2. ProRay<eiDirAxis[i]0

将二者结合:|ProRay|>ei and (DirAxis[i])ProRay0

二:射线方向向量与面法线的叉乘作为分离轴
为了使得计算简单,我们可以将OBB转换为AABB

DirDir =(DirAxis[X],DirAxis[Y],DirAxis[Z])

OO =(deltaAxis[X],deltaAxis[Y],deltaAxis[Z])
则Box的三个轴为:
Axis[X]Axis[X] =(1,0,0)
Axis[Y]Axis[Y] =(0,1,0)
Axis[Z]Axis[Z] =(0,0,1)

则分离轴为:
v=Dir ×Axis[i] 

Axis[i]  v case Axis[X] =(1,0,0) (0,DirAxis[Z],DirAxis[Y]) (1) Axis[Y] =(0,1,0) (DirAxis[Z],0,DirAxis[X]) (2) Axis[Z] =(0,0,1) (DirAxis[Y],DirAxis[X],0) (3)

Box在v上的投影:
ProBox=e0|Axis[X] v|+e1|Axis[Y] v|+e2|Axis[Z] v|

v ProBox case (0,DirAxis[Z],DirAxis[Y]) e1|DirAxis[Z]+e2|DirAxis[Y]| (1) (DirAxis[Z],0,DirAxis[X]) e0|DirAxis[Z]|+e2|DirAxis[X]| (2) (DirAxis[Y],DirAxis[X],0) e0|DirAxis[Y]|+e1|DirAxis[X]| (3)

Ray起点在其上的投影:
ProRay=O v=(deltaAxis[X],deltaAxis[Y],deltaAxis[Z])v

vRay.Direction垂直,因此Ray本身投影在分离轴v为一个点

|ProRay|>ProBox,则未碰撞

以下看看(1)情况下的v来计算ProRay:
v=(0,DirAxis[Z],DirAxis[Y])
ProRay=(deltaAxis[X],deltaAxis[Y],deltaAxis[Z])(0,DirAxis[Z],DirAxis[Y])
=(deltaAxis[Y])(DirAxis[Z])(deltaAxis[Z])(DirAxis[Y])
=(delta.xAxis[Y].x+delta.yAxis[Y].y+delta.zAxis[Y].z)(Dir.xAxis[Z].x+Dir.yAxis[Z].y+Dir.zAxis[Z].z)(delta.xAxis[Z].x+delta.yAxis[Z].y+delta.zAxis[Z].z)(Dir.xAxis[Y].x+Dir.yAxis[Y].y+Dir.zAxis[Y].z)
=(delta.zDir.y,delta.xDir.z,delta.yDir.x)(Axis[X])+(delta.yDir.z,delta.zDir.x,delta.xDir.y)(Axis[X])
=(delta×Dir)Axis[X]

其他情况类似,因此:

v ProRay case (0,DirAxis[Z],DirAxis[Y]) (delta×Dir)Axis[X] (1) (DirAxis[Z],0,DirAxis[X]) (delta×Dir)Axis[Y] (2) (DirAxis[Y],DirAxis[X],0) (delta×Dir)Axis[Z] (3)
0 0
原创粉丝点击