Обнаружение столкновения SAT - устранение углов

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

Я использую алгоритм SAT для обнаружения столкновений. Столкновения происходят между символом (AxisAlignedBoundingBox) и некоторыми прямоугольниками (с вращением).

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

В примере 1 во второй сцене персонаж должен двигаться вверх (оставаться на препятствии).
Это происходит, чтобы двигаться влево.
В примере 2 во второй сцене персонаж не должен вставать. Иногда это получается.

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

Есть несколько решений этой проблемы, но не очень хорошее (с точки зрения решения проблемы, а не создания других!). Я готов даже использовать совершенно другой алгоритм с самого начала.

Пожалуйста, дайте мне подсказку об алгоритме лучше, чем SAT, или о некотором обходном пути.
БЛАГОДАРЮ ВАС!

1 ответ

Картина стоит много слов.

Изображение имеет две рамки для проверки красного и черного.

введите описание изображения здесь

Обратите внимание, что центр черного ящика всегда находится на более темном красном ящике, когда он просто касается.

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

// x,y are box centers
var bBox = { w : 100 , h : 50, x : ?, y ? };  // black
var rBox = { w : 200 , h : 200, x : ?, y ? };  // red

проверить, находится ли bBox внутри rBox

if(bBox.x > rBox.x - (rBox.w + bBox.w)/2 &&
     bBox.x < rBox.x + (rBox.w + bBox.w)/2 &&
     bBox.y > rBox.y - (rBox.h + bBox.h)/2 &&
     bBox.y < rBox.y + (rBox.h + bBox.h)/2)
    // boxes are touching.
}

Также работает, если коробки движутся. Вы просто проверяете, пересекает ли вектор движения bBox любую из четырех сторон rBox.

Другие вопросы по тегам