这通常称为AABB-OBB相交测试。 (轴对齐的边界框和定向的边界框)。如果一个边界框完全位于另一个边界框内,则仍将其视为“相交”。
要解决此问题,请使用分隔轴定理。如果AABB和OBB不重叠,则它们必须至少有一条平行于其一侧的分离轴。
对于OBB-OBB交集测试,您将两个形状投影到8条不同的线上(每个矩形的每个边一条),并对每个投影执行简单的一维重叠测试。
对于AABB-OBB,这基本上是相同的,但是减少到4个投影,因为四对边总是平行的。
看看以下有关OBB-OBB的解释:
https://gamedev.stackexchange.com/questions/25397/obb-vs-obb-collision-detection
,
首先,我要感谢用户“ prideout”为我指明了正确的方向。他的笔记,尤其是仅需要4个法线的笔记,帮助我优化了代码。奇怪的是,the link provided中的代码似乎无法正常工作(确定形状的“压碎”顶点是否重叠)。我发现this useful example in C++为我指明了正确的方向,现在我的代码运行良好。
这是我的AABB-OBB重叠检测器函数+ SAT函数(使用的语言是基于Java的“处理”)。
// True if overlap,False if they don't
boolean seperating_axis_theorem(float[] x1,float[] y1,float[] x2,float[] y2,float[] normal){
float[] range = new float[4]; //minAlong1,maxAlong1,minAlong2,maxAlong2
range[0] = Float.MAX_VALUE;
range[1] = -Float.MAX_VALUE;
range[2] = Float.MAX_VALUE;
range[3] = -Float.MAX_VALUE;
// Dot is projecting the points onto the seperating axis and then we get the max and min
float dotVal;
for(int i = 0; i < 4; i++){
dotVal = dot(x1[i],y1[i],normal[0],normal[1]);
if(dotVal < range[0]){range[0] = dotVal;}
if(dotVal > range[1]){range[1] = dotVal;}
dotVal = dot(x2[i],y2[i],normal[1]);
if(dotVal < range[2]){range[2] = dotVal;}
if(dotVal > range[3]){range[3] = dotVal;}
}
if(range[1] < range[2] || range[0] > range[3]){
return false;
}
return true;
}
// True if two shapes overlap,False otherwise
Boolean AABB_OBB_Overlap(float[] OBB_X,float[] OBB_Y,float[] AABB_X,float[] AABB_Y){
// Checking the camera's normals,simplified since we know its axis aligned so no unit vector calculations needed
float[] range = get_range(OBB_X); // Returns min and max of array
if(range[1] < AABB_X[0] || range[0] > AABB_X[1]){
return false;
}
range = get_range(OBB_Y);
if(range[1] < AABB_Y[0] || range[0] > AABB_Y[2]){
return false;
}
// Checking the sprite's normals
float[] normal1 = unit_vector(OBB_X[1] - OBB_X[0],OBB_Y[1] - OBB_Y[0]); // Top side
float[] normal2 = unit_vector(OBB_X[2] - OBB_X[0],OBB_Y[2] - OBB_Y[0]); // Left side
if(!seperating_axis_theorem(OBB_X,OBB_Y,AABB_X,AABB_Y,normal1)){
return false;
}
if(!seperating_axis_theorem(OBB_X,normal2)){
return false;
}
// They overlap
return true;
}
本文链接:https://www.f2er.com/3129883.html