Псевдокод для Swept AABB Collision - PullRequest
       17

Псевдокод для Swept AABB Collision

3 голосов
/ 02 августа 2010

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

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

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

Объекты могут двигаться только по прямым линиям (хотя, очевидно, они могут изменять направление, например, поворачиваться, но они всегда находятся на оси. Если они пытаются отключить ось, это просто не работает), и связаны с осью. Их ограниченные коробки не вращаются и не делают ничего подобного. Скорость может измениться, но это не имеет значения, поскольку цель метода состоит в том, чтобы определить, находятся ли они, учитывая текущее состояние объектов, на "курсе столкновения". Если вам нужна дополнительная информация, дайте мне знать.

Если бы кто-то мог предоставить какой-нибудь псевдокод (или реальный код), это было бы здорово. Я прочитал документ под названием Пересечение выпуклых объектов: метод разделения осей , но я не понял некоторые псевдокоды в нем (что означает Union)?

Любая помощь приветствуется, спасибо.

1 Ответ

1 голос
/ 02 августа 2010

Когда происходит столкновение, ящики соприкасаются с одной стороны.Вы можете проверить, соприкасаются ли они для пар сторон (LR, RL, UD, DU).

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

Что-то вроде следующего кода:

dLR = B.L - A.R;
dRL = A.L - B.R;
dUD = B.U - A.D;
dDU = A.U - B.D;

vX = A.xV - B.xV;
vY = A.yV - B.yV;

tLR = dLR / vX;
tRL =-dRL / vX;
tUD = dUD / vY;
tDU =-dDU / vY;

hY = dUD + dDU; //combined height
hX = dLR + dRL;

if((tLR > 0) && (abs(dDU + vY*tLR) < hY)) return true;
if((tRL > 0) && (abs(dUD - vY*tRL) < hY)) return true;
if((tUD > 0) && (abs(dRL + vX*tUD) < hX)) return true;
if((tDU > 0) && (abs(dLR - vX*tDU) < hX)) return true;
return false;
...