AABB 3D碰撞检测异常:应碰撞的盒体未被检测到
3D AABB碰撞检测失效排查方案
先明确你给出的两个AABB的实际范围:
- Player(3×3×3)的各轴边界:
- X: 8.5 ~ 11.5
- Y: 5.5 ~ 8.5
- Z: 8.5 ~ 11.5
- Box(1×1×1)的各轴边界:
- X: 9.5 ~ 10.5
- Y: 4.5 ~ 5.5
- Z: 9.5 ~ 10.5
二者在Y轴上是刚好相切(边界重合),没有重叠区域。结合你的问题,大概率是移植时的两个常见错误:
错误1:漏了Z轴的碰撞判断
原2D AABB逻辑只需要判断X、Y两个轴,但3D场景必须同时满足X、Y、Z三个轴的重叠/接触条件才会碰撞。如果你的3D碰撞函数只写了X和Y轴的判断,漏掉了Z轴,会直接导致逻辑错误。
正确的3D AABB碰撞判断需要三个轴的条件同时成立:
bool aabb_collide(AABB a, AABB b) { return ( // X轴判断 fabs(a.position[0] - b.position[0]) <= a.half[0] + b.half[0] && // Y轴判断 fabs(a.position[1] - b.position[1]) <= a.half[1] + b.half[1] && // Z轴判断,必须加上! fabs(a.position[2] - b.position[2]) <= a.half[2] + b.half[2] ); }
错误2:把判断条件从<=改成了<
原noonat的2D代码使用<=,也就是边界接触也算碰撞。你的例子里,Y轴的位置差是7-5=2,两个half之和是1.5+0.5=2,刚好相等。如果移植时把条件改成了<,Y轴的条件就不满足,最终碰撞检测返回false,出现你描述的未碰撞判定。
解决方法是把每个轴的判断改回<=,让边界接触的情况被判定为碰撞。
额外说明
如果你的需求是只有存在重叠区域才算碰撞,那当前的检测结果是正确的——两个AABB在Y轴上确实没有重叠,只是刚好碰到。但如果需求是接触就算碰撞,修正上述两个问题即可解决。
内容的提问来源于stack exchange,提问作者Scollier
相关产品推荐
相关产品推荐

