3d 三维空间中两个长方体之间的交点

3d 三维空间中两个长方体之间的交点,3d,collision-detection,linear-algebra,3d,Collision Detection,Linear Algebra,我想为我的图形引擎实现一个碰撞检测系统 我不知道这是否是一种常见的方法,但我的想法是将任何实体对象(如网格或相机)绑定到一个3D框中,这将给我比球体更精确的结果 此框由八个顶点定义 x0 = min(vertices.x)-off // parsing mesh's vertices for the minimum x y0 = min(vertices.y)-off z0 = min(vertices.z)-off x1 = max(vertices.x)+

我想为我的图形引擎实现一个碰撞检测系统

我不知道这是否是一种常见的方法,但我的想法是将任何实体对象(如网格或相机)绑定到一个3D框中,这将给我比球体更精确的结果

此框由八个顶点定义

    x0 = min(vertices.x)-off   // parsing mesh's vertices for the minimum x
    y0 = min(vertices.y)-off
    z0 = min(vertices.z)-off
    x1 = max(vertices.x)+off   // off avoids 2D bounding on 2D objects
    y1 = max(vertices.y)+off
    z1 = max(vertices.z)+off
    boundingBox[0] = vec3(x0, y0, z0);
    boundingBox[1] = vec3(x0, y1, z0);
    boundingBox[2] = vec3(x1, y0, z0);
    boundingBox[3] = vec3(x1, y1, z0);
    boundingBox[4] = vec3(x0, y0, z1);
    boundingBox[5] = vec3(x0, y1, z1);
    boundingBox[6] = vec3(x1, y0, z1);
    boundingBox[7] = vec3(x1, y1, z1);
在将边界框转换为世界坐标后,我正在寻找一种方法来检查它们之间是否存在交点,但我不知道如何使用线性代数

我想如果我确定所有的盒子都平行于XZ平面,我可以简单地对照box2的最小/最大坐标检查box1的所有顶点,如下所示:

for(int i = 0; i < 8; i++) {
    if(box1[i].x >= box2.minX && box1[i].x <= box2.maxX) &&
      (box1[i].y >= box2.minY && box1[i].y <= box2.maxY) &&
      (box1[i].z >= box2.minZ && box1[i].z <= box2.maxZ) {
        // collision here
    }
}
for(int i=0;i<8;i++){

如果(box1[i].x>=box2.minX&&box1[i].x=box2.minY&&box1[i].y=box2.minZ&&box1[i].z两个定向边界框之间的交点(或两个对象之间更一般的交点)可以通过分离轴定理(,和)实现

对于对象之间的一般相交测试,一个是搜索一个平面,使两个对象位于不同的半空间中,并且该平面不与其中一个对象相交。例如,可以在该图中找到该方法的实现。

/measure 3D边界框之间的重叠,参数化为(ry、h、w、l、tx、ty、tz)/

内联双盒3D重叠(检测d、TGG、int32_t标准=-1)

使用名称空间boost::geometry;
多边形gp=拓扑多边形(g);
多边形dp=拓扑多边形(d);
std::矢量输入,un;
交叉口(gp、dp、in);
工会(gp、dp、un);
双ymax=min(d.t2,g.t2);
双ymin=最大值(d.t2-d.h,g.t2-g.h);
双内部面积=in.empty()?0:面积(in.front());
双间隙容积=间隙面积*最大值(0.0,ymax-ymin);
双det_vol=d.h*d.l*d.w;
双gt_vol=g.h*g.l*g.w;
双o;
if(条件==-1)//并集
o=内部卷/(详细卷+总卷-内部卷);
else if(条件==0)//bbox\u a
o=内部卷/详细卷;
else if(条件==1)//bbox\u b
o=内部卷/总卷;
返回o;
这应该会有帮助-
using namespace boost::geometry;
Polygon gp = toPolygon(g);
Polygon dp = toPolygon(d);

std::vector<Polygon> in, un;
intersection(gp, dp, in);
union_(gp, dp, un);

double ymax = min(d.t2, g.t2);
double ymin = max(d.t2 - d.h, g.t2 - g.h);

double inter_area = in.empty() ? 0 : area(in.front());
double inter_vol = inter_area * max(0.0, ymax - ymin);

double det_vol = d.h * d.l * d.w;
double gt_vol = g.h * g.l * g.w;

double o;
if(criterion==-1)     // union
    o = inter_vol / (det_vol + gt_vol - inter_vol);
else if(criterion==0) // bbox_a
    o = inter_vol / det_vol;
else if(criterion==1) // bbox_b
    o = inter_vol / gt_vol;

return o;