两个非旋转立方体的重叠仍然是一个"盒子".如果框A的两个角点是(x,y,z)和(x',y',z')(x'> x,y'> y,z'> z),则框B的两个角点是(a,b,c)和(a',b',c')(a'> a,b'> b,c'> c)然后重叠的体积是
max(min(a',x')-max(a,x),0)
* max(min(b',y')-max(b,y),0)
* max(min(c',z')-max(c,z),0)
Run Code Online (Sandbox Code Playgroud)
如何阅读公式:
重叠在X轴上以两个坐标x和a的最大值开始,并且以'和x'的最小值结束.如果'<x(即a <a'<x <x')则没有重叠,发生的是max(a,x)= x> min(a',x')= a',所以区别变为负数且体积为零(因此外部最大(...,0))项.这同样适用于其他两个轴.
计算每个立方体每个维度的最小值/最大值,然后相互测试它们,例如在立方体标记为 1 和 2 的 x 方向上
XminInt;
if ( Xmin1 > Xmax2 )
{
// no intersection
}
else if ( Xmin1 >= Xmin2 )
{
// possible cube intersection
XminInt = Xmin1;
}
else if ( Xmin2 <= Xmax1 )
{
// possible cube intersection
XminInt = Xmin2;
}
Run Code Online (Sandbox Code Playgroud)
对 max 执行类似的操作,并对 y 和 z 重复。如果您遇到其中任何一个没有交叉路口的情况,那么您可以提前退出。如果您没有在六个可能的早期退出子句中的任何一个中提前退出,那么您将拥有交集立方体的所有六个定义值,即每个维度的最小值/最大值。
六个早期回报几乎是分离轴方法最简单的例子。由于您的形状是立方体并且轴对齐,因此笛卡尔轴是可能的分离轴。然后,测试就是比较上述最小/最大值的简单问题。
请注意,我已经用 C++ 实现了上述方法并确认它有效。