【问题标题】:(2d Square Collision Detection) Moving objects apart when they collide stuttering(2d Square Collision Detection)当物体碰撞时将物体分开
【发布时间】:2019-08-04 20:55:18
【问题描述】:

我到处寻找有关碰撞检测的一些技巧,但我似乎真的找不到任何对我有意义或对我有用的东西。我了解如何检测两个正方形是否发生碰撞,但我不明白如何以正确的方式将它们与重力分开,以及什么不适用于它们。

if (tile->position.x < other->position.x + Tile::size && tile->position.x + Tile::size > other->position.x &&
            tile->position.y < other->position.y + Tile::size && tile->position.y + Tile::size > other->position.y) {

            glm::vec3 tCenter = tile->getCenter();
            glm::vec3 oCenter = other->getCenter();

            glm::vec3 dir = tCenter - oCenter;

            dir.x = dir.x / (Tile::size / 2.0f);
            dir.y = dir.y / (Tile::size / 2.0f);

            tile->position += dir;
            tile->velocity *= 0.0f;
        }

所以基本上如果发生碰撞,然后将它们分开。在网上阅读了一些东西后,我想出了这个方法。这是超级接近,但有一些我似乎无法理解的口吃。

https://youtu.be/3NJMPDphy3A

有谁知道我错过了什么或者你能指出我正确的方向吗?

【问题讨论】:

    标签: c++ 2d collision-detection game-physics collision


    【解决方案1】:

    视频看起来不错!这更像是一个建议,但评论太长了。

    在这段代码之外没有旋转或其他花哨的东西,对吧?只检查 y=0(地面)或类似的重力、运动和一些边界?

    你移动每个方格的距离与方格之间的距离成正比,这似乎有点奇怪。然后直接在彼此顶部的正方形甚至不应该移动。您可以在视频中的几个地方看到它。

    你会试试这个并告诉我它是否有改进吗?

    而不是这个:

    dir.x = dir.x / (Tile::size / 2.0f);
    dir.y = dir.y / (Tile::size / 2.0f);
    
    tile->position += dir;
    

    试试这个:

    float dmax = max(abs(dir.x), abs(dir.y));
    float scaleFactor = Tile::size / dmax;
    
    dir.x *= scaleFactor;
    dir.y *= scaleFactor;
    
    tile->position = other->position + dir;
    

    并保持

    tile->velocity *= 0.0f;
    

    我实际上并不了解 C++,但我认为上面的代码是有效的。我希望这会有所帮助。

    【讨论】:

    • 感谢您的建议。我试过这个,它似乎比另一个更好。仍然存在一些问题,一些瓷砖只是滑过其他瓷砖,直到它们到达末端并掉下来或被推入地面或推入其他瓷砖。我一定错过了一些事情,比如没有多次检查相同的两个图块,如果这甚至有意义的话或其他的东西,但我不知道是什么原因造成的。
    • 或者我需要添加更多迭代?
    • 我认为滑动的发生是因为您(大概)施加了重力,将块向下移动了一点,然后我们的两个代码都将它们推到一边以增加它们之间的距离。您可以添加一个检查,例如(如果下面有一个小于 1.001 tile-size 的块:不要应用重力)。但这需要更多的编码。当然,更小的时间步长也会使其更平滑。我没有别的想法:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多