给定每个边界的最小和最大Vector3,检查两个边界框相交的最佳方法是什么?

我有一个BoundingBox对象,它包含两个Vector3(x,y,z),一个用于最小点,另一个用于最大点。 (-1.5 0 9 | 1.5 3 10)

检查两个BoundingBox的交集或重叠的最好方法是什么?

当没有实际相交的点时,交叉点的testing会发生得更多。

我目前使用的代码是: bb1.max_.x_ > bb2.min_.x_ && bb1.min_.x_ < bb2.max_.x_ && bb1.max_.y_ > bb2.min_.y_ && bb1.min_.y_ < bb2.max_.y_ && bb1.max_.z_ > bb2.min_.z_ && bb1.min_.z_ < bb2.max_.z_;

但是,当点数是-1.5 0 9 | 1.5 3 10时,会导致问题 -1.5 0 9 | 1.5 3 10-0.5 0 8.5 | 0.5 1.8 10.5相交-0.5 0 8.5 | 0.5 1.8 10.5 -0.5 0 8.5 | 0.5 1.8 10.5 …第二个物体的Z最小点和最大点完全位于第一个物体的Z min和max之外。

这个想法对于一维,二维或三维或任何其他维度实际上是一样的。 首先我们来谈谈一个一维场景:

我们沿x轴有两个分段,我们知道他们的开始和结束。 让他们成为s1,e1,s2,e2 。 那么这两条线的重叠要求是什么呢? 好吧,我们可以说第一行应该在第二行结束之前开始,反之亦然。 这意味着我们必须检查: s1 < e2 && s2 < e1 。 这就是我们需要检查的所有东西。

现在要解决更高维度的问题,我们将使用边界框(矩形)实际上是轴alignment的事实。 使用这个事实,我们可以放心地假设,如果两个盒子要被收敛,他们对轴线的投影也应该重叠。 记住这一点,不管你有多less维度,你只需要检查上面的语句( s1 < e2 && s2 < e1 )的每一个维度。 只有当所有这些条件都成立的时候,两个盒子才会被打包。