You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

判断两个3D空间盒子是否相交的最简方法探讨

判断两个3D轴对齐盒子是否相交的最简方法

对于你给出的这种由对角点定义的3D盒子(默认是轴对齐的,也就是各边平行于坐标轴),判断它们是否相交最直接高效的方法是用分离轴定理的简化版,核心逻辑很简单:如果两个盒子在X、Y、Z任意一个坐标轴上的投影完全不重叠,那它们肯定不相交;只有三个轴的投影都重叠时,盒子才会相交。

具体步骤:

  1. 整理每个盒子的轴范围:因为给出的对角点不一定是按“最小坐标-最大坐标”顺序排列的,所以对每个盒子,分别计算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
    • 对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
  2. 检查投影重叠情况:

    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:36:45