gpt4 book ai didi

c++ - (2d Square Collision Detection) 碰撞时移动物体

转载 作者:太空宇宙 更新时间:2023-11-04 12:39:05 24 4
gpt4 key购买 nike

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

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

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

最佳答案

视频很好看!这更像是一个建议,但对于评论来说太长了。

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

关于c++ - (2d Square Collision Detection) 碰撞时移动物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55154453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com