Math 盒到球体碰撞

Math 盒到球体碰撞,math,3d,Math,3d,我需要检查一个盒子是否与一个球体碰撞。我有一个用x、y、z、宽度、高度和深度定义的边界框类。我还有一个用x,y,z,radius定义的BoundingSphere类。如何检查它们是否相交?如果要将测试保持在所描述的级别,可以在球体周围放置一个边界框,其中宽度、高度和深度=2r。当然,这承认了在球体上“非极性”或“非赤道”点发生碰撞的误报风险。为了解决这个问题,您可以考虑构建一系列层次包围盒以增加这些问题区域中的命中测试的粒度。 您还可以从渲染级别处理该问题。由于无法渲染球体,因此通常使用某种多边

我需要检查一个盒子是否与一个球体碰撞。我有一个用x、y、z、宽度、高度和深度定义的边界框类。我还有一个用x,y,z,radius定义的BoundingSphere类。如何检查它们是否相交?

如果要将测试保持在所描述的级别,可以在球体周围放置一个边界框,其中宽度、高度和深度=2r。当然,这承认了在球体上“非极性”或“非赤道”点发生碰撞的误报风险。为了解决这个问题,您可以考虑构建一系列层次包围盒以增加这些问题区域中的命中测试的粒度。
您还可以从渲染级别处理该问题。由于无法渲染球体,因此通常使用某种多边形网格。2D(或3D)多边形之间的命中测试是一个简单的练习。

您只需根据距球体中心的距离检查边界框的所有角。下面是一些伪代码:

bool collidesWith(BoundingBox b, BoundingSphere s) {
  for(Vertex v in b) {
    if(distanceBetween(v, s.center) <= s.radius)
      return true;
  }
  return false;
}
bool collizeswith(边界框b,边界球体s){
对于(b中的顶点v){

if(distanceBetween(v,s.center)首先要检查的是边界球的边界框是否相交。原因是这是一种非常简单的方法,可以排除更复杂的数学问题

下一步是选取边界框的六个平面(或十二个三角形)中的每一个,并对它们进行从点到多边形到球体中心的距离测试。如果其中一个平面小于球体的半径,那么您就成功了


多边形到点距离的Matlab代码:

Jim Arvo的《图形宝石》中有一章


我猜上面陈旧的链接曾经指向他的代码,因为URL中有“arvo”。这很有效-至少现在是这样。

可能重复:(尽管主题上写着“cube”,但答案适用于所有轴对齐的框)。这不适用于只有一条边相交的情况。按照OP的要求,在轴对齐的边界框周围有顶点是非常不典型的。更重要的是,“just”不起作用(如前所述)对于这种情况来说也有点太慢了。很好的发现,链接是最新的,涵盖了多个案例。我看到大多数游戏引擎都使用实心框、实心球算法(以各种优化形式)。