Ray Box 碰撞检测

Box采用OBB定义:

enum AxisDefine
{
    X , 
    Y , 
    Z
};

// data member 
Vector3f Center;
Vector3f Axis[3];
float extent[3];    // 边长的一半

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

// data
Vector3f 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>ei DirAxis[i]0 (即光线方向与分离轴的方向范围为 (90,90)
  2. ProRay<ei DirAxis[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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值