Очень простое разрешение столкновений с интеграцией верлетов
Я учусь делать некоторые базовые физические вещи для собственного удовольствия, но сталкиваюсь со странной проблемой.
Я использую исправленный по времени метод интеграции верлетов, как описано на 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 ответ
Разделяя их, вы разрешаете их скорости / импульсы. Как ты это делаешь?
Скорее всего, для определения направления разделения вы используете вектор, который идет от центра каждого. Чем глубже проникновение, тем менее точным может быть этот вектор (нормаль столкновения). Это может привести к неожиданным результатам.
Что работает лучше, так это не разделять их, а вычислить, где будет находиться точка столкновения, прежде чем перемещать их, а затем только перемещать их так далеко... затем разрешать скорости... затем перемещать их в новом направлении для остальное время среза. Конечно, это немного сложнее, но результаты более точны.