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