(2d方形碰撞检测)当物体碰撞时会将物体分开

问题描述 投票:1回答:1

我到处寻找有关碰撞检测的一些提示,但我似乎无法找到任何对我有意义或在我的情况下工作的东西。我理解如何检测两个方形是否发生碰撞,但我不明白该怎么做才能将它们与重力分开,以及不适用于它们的方法。

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个回答
0
投票

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

这段代码之外没有旋转或其他花哨的东西,对吧?只是重力,运动和一些界限检查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 ++,但我认为上面的代码是有效的。我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.