2011-02-25 126 views
2

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

+0

可能的重复:http://stackoverflow.com/questions/4578967/cube-sphere-intersection-test(虽然主题那里说“立方体”,答案适用于所有轴对齐框)。 – 2011-02-25 20:33:50

回答

1

如果您想保持测试的水平,您可以在宽度,高度和深度= 2r的球体周围放置边界框。当然,这承认球体上“非极性”或“非赤道”点的碰撞误报风险。为了解决这个问题,你可以考虑构建一系列层次边界框来增加这些问题区域中命中测试的粒度。

您可能还会从渲染级别解决问题。由于您无法渲染球体,因此通常会使用某种多边形网格。在2D(或3D)多边形之间进行打击测试是一项直接的练习。

+0

不错的发现,链接是最新的,涵盖多个案例。实体盒实体球算法是我见过的大多数游戏引擎使用的(以各种优化形式)。 – Kaganar 2013-05-14 21:58:12

-2

你只需要检查边界框的所有角落与球体中心的距离。这是一些伪代码:

bool collidesWith(BoundingBox b, BoundingSphere s) { 
    for(Vertex v in b) { 
    if(distanceBetween(v, s.center) <= s.radius) 
     return true; 
    } 
    return false; 
} 
+4

这不处理只有一个边相交的情况。 – corsiKa 2011-02-25 20:35:49

+0

好点 - 谢谢。 – 2011-02-25 20:37:30

+0

这是非常不典型的,因为OP所要求的轴对齐边界框周围有顶点。更重要的是,“正义”不起作用(正如已经指出的那样),对于这种情况也仅仅有点太慢。 – Dude 2012-09-23 21:29:52

3

首先要检查的是BoundingSphere的BoundingBox是否相交。这是因为这是一个排除更复杂数学的简单方法。

下一步将采用边界框的六个平面(或十二个三角形)中的每一个,并对它们执行从点到多边形测试的距离到球体的中心。如果其中一个小于球体的半径,那么你有一个命中。

多边形,以点距离Matlab代码:http://www.mathworks.com/matlabcentral/fileexchange/12744-distance-from-a-point-to-polygon

0

有由吉姆·帕特在图形宝石的一章。

我想上面陈旧的链接用来指向他的代码,因为URL中有“arvo”。这link作品 - 至少现在。