(2d Square Collision Detection) Раздвигая объекты, когда они сталкиваются заикаться - PullRequest
1 голос
/ 14 марта 2019

Я искал повсюду несколько советов по обнаружению столкновений, но я действительно не могу найти ничего, что имеет смысл для меня или работает в моем случае. Я понимаю, как определить, сталкиваются ли две квадратные фигуры или нет, но я не понимаю, что делать с точки зрения их правильного разделения с гравитацией и того, что не применяется к ним.

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

Кто-нибудь знает, чего мне не хватает, или вы можете указать мне правильное направление?

1 Ответ

0 голосов
/ 14 марта 2019

Видео выглядит красиво!Это скорее предложение, но оно было слишком длинным для комментария.

За пределами этого кода нет вращения или других причудливых вещей, верно?Только гравитация, движение и некоторые границы проверяют 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 ++, но я думаю, что приведенный выше код действителен.Надеюсь, это поможет.

...