-2

Я строю игру, и сейчас я работаю над физикой.SAT обнаружение столкновений - исправление углов

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

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

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

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

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

Пожалуйста, дайте мне подсказку об алгоритме лучше, чем SAT, или обходной путь.
СПАСИБО!

+0

Не могли бы вы показать код? Какой контакт нормальный вы получаете в каждом случае и что вы ожидаете? (для меня первый должен быть '(0, 1)' и вторым '(-1, 0)', и именно это вы должны смотреть на минимальный вектор перевода) – Zouch

+0

Нет, есть больше аспектов, чем простой движение. dx, dy, гравитация играет роль в этом. ех. MTV: (-2, -0.35) -> персонаж должен переместить -2 на оси X и -0.35 на оси Y, чтобы выйти из столкновений –

+0

Вам нужно указать код и уточнить проблему. Если у вас возникли проблемы с обработкой коллизий, это может быть не связано с алгоритмом, который вы используете для их обнаружения, но с тем, как вы вычисляете ответ. – Zouch

ответ

0

Изображение стоит много слов.

Изображение имеет две коробки, чтобы проверить красный и черный ..

enter image description here

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

Вы можете упростить любой тест 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 с любой из сторон 4 стороны rBox.

+0

Большое спасибо за ваш ответ! Умное обходное решение, мое единственное беспокойство касается вращения. Коробка RED может быть повернута, поэтому я использую SAT. Я могу проверить перед столкновением, если символ оставлен - справа - над или под красным полем (повернут или нет), но это не очень помогает мне! –