判断两个3D空间盒子是否相交的最简方法探讨
判断两个3D轴对齐盒子是否相交的最简方法
对于你给出的这种由对角点定义的3D盒子(默认是轴对齐的,也就是各边平行于坐标轴),判断它们是否相交最直接高效的方法是用分离轴定理的简化版,核心逻辑很简单:如果两个盒子在X、Y、Z任意一个坐标轴上的投影完全不重叠,那它们肯定不相交;只有三个轴的投影都重叠时,盒子才会相交。
具体步骤:
整理每个盒子的轴范围:因为给出的对角点不一定是按“最小坐标-最大坐标”顺序排列的,所以对每个盒子,分别计算X、Y、Z三个轴的最小值和最大值:
- 对Box1:
- X范围:
min(961.46, 970.02)= 961.46 到max(961.46, 970.02)= 970.02 - Y范围:
min(215.15, 214.93)= 214.93 到max(215.15, 214.93)= 215.15 - Z范围:
min(1465.44, 1481.77)= 1465.44 到max(1465.44, 1481.77)= 1481.77
- X范围:
- 对Box2:
- X范围:
min(1093.52, 1093.12)= 1093.12 到max(1093.52, 1093.12)= 1093.52 - Y范围:
min(-499.50, -505.49)= -505.49 到max(-499.50, -505.49)= -499.50 - Z范围:
min(896.11, 878.68)= 878.68 到max(896.11, 878.68)= 896.11
- X范围:
- 对Box1:
检查投影重叠情况:
- X轴:Box1的最大X值是970.02,Box2的最小X值是1093.12——970.02 < 1093.12,两个区间完全不重叠,这直接就能判断两个盒子不相交,后面的Y、Z轴甚至不用再检查了。
通用代码实现(以Python为例)
如果需要批量判断或者集成到项目里,可以写一个简单的函数:
def is_axis_aligned_boxes_intersect(box1_p1, box1_p2, box2_p1, box2_p2): # 计算Box1的各轴极值 b1_x_min, b1_x_max = min(box1_p1[0], box1_p2[0]), max(box1_p1[0], box1_p2[0]) b1_y_min, b1_y_max = min(box1_p1[1], box1_p2[1]), max(box1_p1[1], box1_p2[1]) b1_z_min, b1_z_max = min(box1_p1[2], box1_p2[2]), max(box1_p1[2], box1_p2[2]) # 计算Box2的各轴极值 b2_x_min, b2_x_max = min(box2_p1[0], box2_p2[0]), max(box2_p1[0], box2_p2[0]) b2_y_min, b2_y_max = min(box2_p1[1], box2_p2[1]), max(box2_p1[1], box2_p2[1]) b2_z_min, b2_z_max = min(box2_p1[2], box2_p2[2]), max(box2_p1[2], box2_p2[2]) # 检查三个轴是否都有重叠 x_overlap = not (b1_x_max < b2_x_min or b2_x_max < b1_x_min) y_overlap = not (b1_y_max < b2_y_min or b2_y_max < b1_y_min) z_overlap = not (b1_z_max < b2_z_min or b2_z_max < b1_z_min) return x_overlap and y_overlap and z_overlap # 代入你提供的坐标测试 box1_p1 = (961.46, 215.15, 1465.44) box1_p2 = (970.02, 214.93, 1481.77) box2_p1 = (1093.52, -499.50, 896.11) box2_p2 = (1093.12, -505.49, 878.68) print(is_axis_aligned_boxes_intersect(box1_p1, box1_p2, box2_p1, box2_p2)) # 输出False,说明不相交
补充说明
如果你的盒子是非轴对齐(即有旋转,各边不平行于坐标轴)的,那就要用完整的分离轴定理,需要检查6个盒子面的法线作为分离轴,但这种情况计算量会大一些——不过从你给出的坐标来看,显然是轴对齐的盒子,用上面的简化方法就足够了。
内容的提问来源于stack exchange,提问作者Eric F
相关产品推荐
相关产品推荐

