C ++冲突问题

时间:2014-04-26 12:46:12

标签: c++ collision sfml quadtree

我正在测试四叉树中众多移动方块之间的碰撞。

当两个方碰撞时,我会反转它们的速度,如下所示:

    for (auto pair : collisionPairs)
    {
        auto& square1 = static_cast<Square&>(*(pair.first));
        auto& square2 = static_cast<Square&>(*(pair.second));

        square1.setVelocity(-square1.getVelocity());

        square2.setVelocity(-square2.getVelocity());

    }

问题是,碰撞检测并不总是在一帧内。

有时候,它们是同一个正方形之间多个帧的碰撞,因为正方形已经交叉到深处。

因此方块重叠并且它们无限地反转它们的速度,这导致0速度(速度+速度= 0)

我该如何解决这个问题?

编辑:我发现深交会问题是由我的四叉树引起的,我忘了检查与儿童树的物体的碰撞。

现在它仍然发生但很少发生,比如100次碰撞中的1次,然后是100次碰撞中的20次

2 个答案:

答案 0 :(得分:2)

您可以为Square课程另外提供inCollision()个州,并另外检查此内容:

if(!square1.inCollision()) {
    square1.setVelocity(-square1.getVelocity());
    square1.setInCollision(true);
}

// Analogous code for square2

// Set inCollision state to false, when you build the collisionPairs
// Simplyfied pseudo code:
if(intersect(square1,square2) {
     // make_pair blah blah
}
else {
     square1.setInCollision(false);
     square2.setInCollision(false);
}

答案 1 :(得分:2)

除了纯碰撞检测之外,我还要检查方块的中心是否朝向彼此移动,并且仅在第一种情况下恢复它们的速度。我要提供一个示例,您必须提供有关Square课程实施的信息。

编辑:基本上逻辑看起来像这样:

if (collision detected) {
    if ( (square2.posx-square1.posx)* (square2.vx-square1.vx) < 0) {            
        // EDIT: exchange velocities of square1 and square2 in x direction
    }
    if ( (square2.posy-square1.posy)* (square2.vy-square1.vy) < 0) {             
        // EDIT: exchange velocities of square1 and square2 in y direction
    }
}

这当然远非逼真的碰撞模拟,但如果你只是想看看你的碰撞检测是否正常,那就足够了。 顺便说一句。我假设,矩形边缘都沿着x和y轴定向。