Очень простое разрешение коллизий с интеграцией верлетов - PullRequest
2 голосов
/ 17 апреля 2011

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

Я использую исправленный по времени метод интеграции верлетов, как описано в http://www.lonesock.net/article/verlet.html, и до сих пор он работал довольно хорошо. Все движения и прочее выглядят довольно хорошо.

Моя проблема связана с разрешением коллизий. Я могу разрешить (кажется, довольно хорошо) против местности, так как местность не движется. Я просто установил текущую позицию игрока в безопасное место, и все кажется хорошим. Тем не менее, когда я пытаюсь решить проблему с другим спрайтом (физическим актером и т. Д.), Вещи, кажется, стреляют повсюду.

Мой код разрешения выглядит следующим образом:

void ResolveCollision(Sprite* entity1, Sprite* entity2)
{
    Vec2D depth = GetCollisionDepth(entity1, entity2);
    if (GetSpritePhysical(entity1) && GetSpritePhysical(entity2))
    {
        /* Two physical objects. Move them apart both by half the collision depth. */
        SetPosition(entity1, PointFromVector(AddVectors(
            VectorFromPoint(GetPosition(entity1)), ScalarMultiply(0.5f, depth))));
        SetPosition(entity2, PointFromVector(AddVectors(
            VectorFromPoint(GetPosition(entity2)), ScalarMultiply(-0.5f, depth))));
    }
    else if (GetSpritePhysical(entity1) && !GetSpritePhysical(entity2))
    {
        SetPosition(entity1, PointFromVector(AddVectors(
            VectorFromPoint(GetPosition(entity1)), ScalarMultiply(-1.0f, depth))));
    }
    else if (!GetSpritePhysical(entity1) && GetSpritePhysical(entity2))
    {
        SetPosition(entity2, PointFromVector(AddVectors(
            VectorFromPoint(GetPosition(entity2)), depth)));
    }
    else
    {
        /* Do nothing, why do we have two collidable but nonphysical objects... */
    }
}

Как можно видеть, есть три случая, определяемых физическим или нет столкнувшимся спрайтом.

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

Почему столкнувшиеся спрайты разлетелись повсюду? Я довольно озадачен этой проблемой. Любая помощь будет великолепна.

1 Ответ

1 голос
/ 17 апреля 2011

Разделяя их, вы разрешаете их скорости / импульсы.Как вы это делаете?

Скорее всего, чтобы определить направление для разделения, вы используете вектор, который идет от центра каждого.Чем глубже проникновение, тем менее точным может быть этот вектор (нормаль столкновения).Это может привести к неожиданным результатам.

Что лучше работает, так это не разделять их, а вычислить, где будет находиться точка столкновения, прежде чем перемещать их, а затем только перемещать их так далеко ... затем решитьскорости ... затем переместите их в новом направлении для оставшейся части времени.Конечно, это немного сложнее, но результаты более точны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...