【发布时间】:2015-03-26 01:31:54
【问题描述】:
我想为我的图形引擎实现一个碰撞检测系统。
我不知道这是否是常见的方法,但我的想法是将任何实体对象(如网格或相机)绑定在 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 平面,我可以简单地检查 box1 的所有顶点与 box2 的最小/最大坐标,如下所示:
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
}
}
但这不起作用,因为网格可能已经旋转。有没有我可以使用的数学公式?
【问题讨论】:
-
这应该会有所帮助 - gamedev.stackexchange.com/questions/25397/…
标签: 3d collision-detection linear-algebra