我到处寻找有关碰撞检测的一些提示,但我似乎无法找到任何对我有意义或在我的情况下工作的东西。我理解如何检测两个方形是否发生碰撞,但我不明白该怎么做才能将它们与重力分开,以及不适用于它们的方法。
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;
}
所以基本上如果发生碰撞,那么将它们分开。在网上阅读了一些内容之后我想出了这个方法。这是非常接近,但有一些口吃,我似乎无法想象。
有谁知道我错过了什么,或者你能指出我正确的方向吗?
视频看起来不错!这更像是一个建议,但评论太长了。
这段代码之外没有旋转或其他花哨的东西,对吧?只是重力,运动和一些界限检查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 ++,但我认为上面的代码是有效的。我希望这有帮助。