我需要检查一个盒子是否与球体碰撞。我有一个用x,y,z,宽度,高度,深度定义的BoundingBox类。我还有一个用x,y,z,radius定义的BoundingSphere类。如何检查它们是否相交?
答案 0 :(得分:3)
首先要检查的是BoundingSphere的BoundingBox是否相交。这样做的原因是它是一种非常简单的方法来排除所涉及的更复杂的数学。
下一步是采用边界框的六个平面(或十二个三角形)中的每一个,并在点到多边形上测试它们到球体的中心。如果其中一个小于球体的半径,那么你就有了一个命中。
多边形到点距离的Matlab代码:http://www.mathworks.com/matlabcentral/fileexchange/12744-distance-from-a-point-to-polygon
答案 1 :(得分:1)
如果要将测试保持在所描述的水平,可以在球体周围放置一个宽度,高度和深度= 2r的边界框。当然,这承认了球体上“非极性”或“非赤道”点碰撞的误报风险。要解决这个问题,您可以考虑构建一系列分层边界框,以增加这些问题区域中命中测试的粒度。
您也可以从渲染级别处理问题。由于无法渲染球体,因此通常使用某种多边形网格。在2D(或3D)多边形之间进行测试是一项简单的练习。
答案 2 :(得分:0)
Jim Arvo的图形宝石中有一章。
我猜上面的陈旧链接过去常常指向他的代码,因为URL中有“arvo”。这link有效 - 至少现在。
答案 3 :(得分:-2)
您只需检查边界框的所有角落与球体中心的距离。这是一些伪代码:
bool collidesWith(BoundingBox b, BoundingSphere s) {
for(Vertex v in b) {
if(distanceBetween(v, s.center) <= s.radius)
return true;
}
return false;
}