【问题标题】:C++ collision issueC++ 冲突问题
【发布时间】:2014-04-26 12:46:12
【问题描述】:

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

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

    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 (-velocity + velocity = 0)

我该如何解决这个问题?

编辑:我发现深度交叉问题是由我的四叉树引起的,我忘记检查与子树对象的碰撞。

现在它仍然会发生,但很少发生,例如 100 次碰撞中的 1 次,之前是 100 次碰撞中的约 20 次

【问题讨论】:

  • 也许您也应该修改它们的位置,以便它们在开始朝新方向移动之前不再重叠。
  • 更新:请看我的编辑。 (我稍后会接受其中一个答案,因为似乎有几种解决方法。)
  • 请不要发布代码链接!将其缩小到相关部分并在您的问题中显示。

标签: c++ collision sfml quadtree


【解决方案1】:

除了纯粹的碰撞检测之外,我还要检查正方形的中心是否相互移动,并且只在第一种情况下恢复它们的速度。为了让我提供一个示例,您必须提供有关您实现 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 轴定向。

【讨论】:

  • “只在第一种情况下恢复它们的速度”,在第二种情况下?无论如何我并不想要真实的碰撞,它只是为了测试我的四叉树,即使它很奇怪,倒车也可以。
  • 如果它们不相互移动,则它们的速度已经反转,无需再次反转
  • 啊,我明白了,我误会了
  • 这似乎是最简单的方法,但我很难知道中心是否相互移动,是否有一个简单的公式来检查这两个正方形的位置和速度?跨度>
  • 查看我的编辑。很抱歉没有使用您的实际课程
【解决方案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);
}

【讨论】:

  • 我认为如果一个对象同时与多个对象发生碰撞,这可能会带来一些问题。
  • @broncoAbierto 这就是我写简化伪代码:的原因。
  • 即使简化,我认为 inCollision 状态也不够。在每一帧中,一旦检测到 objectA 与 objectB 发生碰撞,就不会再检测到 objectA 的碰撞。有必要存储每个可能的碰撞对的状态。
猜你喜欢
  • 2017-11-22
  • 2019-04-19
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
相关资源
最近更新 更多