3D空间框到框碰撞预测

时间:2013-08-04 15:17:43

标签: math vector geometry collision intersection

我正在开发一个碰撞预测系统(语言在这里真的是无关紧要的),我正在寻找一种方法来预测在给定时间后两个物体的撞击箱的碰撞。我拥有的变量是:

  • 第一实体
  • 第二实体
  • 第一个和第二个实体实体边界框的最大和最小XYZ(“最高”角和“最低”角)
  • 第一和第二实体速度(我们假设其常数)
  • 时间

我到目前为止所尝试的是计算plausable entity position after given time然后基于计算两个实体的hitboxes max and min positions并检查这些位置是否发生碰撞。我这样做的方式包括非常多的循环并且效率非常低,尽管我没有使用任何数学公式,因为我还没找到。

StackOverflow上有一个,但对于2D碰撞预测,您可以找到它here

我希望有人帮助我将其扩展到3D空间。

1 个答案:

答案 0 :(得分:3)

这是我将如何做到的。首先,找到两个框的X坐标重叠的时间间隔。你可以通过求解t中的两个线性方程来做到这一点,表示X坐标刚刚接触的时间:

  • 时间t的实体1的最小X =时间t的实体2的最大X
  • 时间t的实体1的最大X =时间t的实体2的最小X

如果您需要帮助设置该部分,请告诉我们!

现在,为Y坐标解决同样的问题。如果Y的间隔与X的间隔不相交,则框不会发生碰撞。如果间隔相交,则采取交叉点并继续前进。

解决Z坐标的问题以获得另一个间隔。如果Z的间隔与X和Y的间隔不相交,则框不会发生碰撞。如果间隔确实相交,则选择交点。

现在你有一个时间间隔[t1,t2],表示当盒子的所有三个坐标重叠时的所有时间点 - 换句话说,当盒子重叠时的所有时间点!所以t1是它们碰撞的时间点。

(另一种方法是用椭圆替换hitbox,并解决其他StackOverflow线程中的二次方程式。但是,在这种情况下,数学实际上更难。使用轴对齐框意味着你可以将问题分解为每个坐标独立并坚持线性方程。)

编辑:根据要求,以下是设置线性方程式的方法。

struct Entity
{
    float x1; // Minimum value of X
    float x2; // Maximum value of X
    float vx; // Velocity in X
    // etc.
};

Entity entity1;
Entity entity2;

// Find the interval during which the X-coordinates overlap...

// TODO: Handle the case Entity1.vx == Entity2.vx!!!

// Solve for Entity1.x1 + t * Entity1.vx = Entity2.x2 + t * Entity2.vx
// t * Entity1.vx - t * Entity2.vx = Entity2.x2 - Entity1.x1
// t * (Entity1.vx - Entity2.vx) = Entity2.x2 - Entity1.x1
float timeXa = (Entity2.x2 - Entity1.x1) / (Entity1.vx - Entity2.vx);

// And the other side...
// Entity1.x2 + t * Entity1.vx = Entity2.x1 + t * Entity2.vx
// t * Entity1.vx - t * Entity2.vx = Entity2.x1 - Entity1.x2
// t * (Entity1.vx - Entity2.vx) = Entity2.x1 - Entity1.x2
float timeXb = (Entity2.x1 - Entity1.x2) / (Entity1.vx - Entity2.vx);

float timeXMin = std::min(timeXa, timeXb);
float timeXMax = std::max(timeXa, timeXb);

然后对Y和Z做同样的事情,并且相交时间间隔。请注意,我可能已经做了一些愚蠢的符号错误,并且我没有处理等速情况,这可能导致除以零。您需要在最终代码中进行一些快速单元测试,以确保它能给出合理的结果。