2009-11-23 5 views
1

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

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

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

Теперь я загружаю как карту комнаты, так и объекты как матрицу 1 и 0 в мою программу. У меня есть одна матрица для первой и другая матрица для каждого из объектов, которые я загружаю в комнату.

Объект сможет свободно перемещаться по комнате, перемещаясь на любое расстояние, под любым углом и позволяя вращаться. Как мне приступить к разработке метода, который позволяет мне поворачивать объект под любым углом и все еще иметь возможность обнаруживать столкновения? Я имею в виду, что если бы объект мог просто подняться, вниз, влево и вправо, я мог бы просто проверить обе матрицы, чтобы увидеть, перекрывают ли они один из 1-го. Но если я хочу повернуть объект, скажем, на 10º, я не вижу, как я могу преобразовать это в матрицу и проверить ее на матрицу стены.

Должен ли я отбросить матричное представление и создать математические области и справиться с этим, поскольку мы имеем дело с ним в исчислении IR^2, с некоторой библиотекой? Разве это не было бы дорогостоящим в вычислительных терминах?

Что такое простой способ для этого? Он не должен быть первоклассным методом, но я использую его для сложного алгоритма, и я бы не хотел потерять слишком много вычислительного времени на каждой итерации с этим.

ответ

1

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

+0

Да, я уже думал об этом. –

+0

Что касается более точного метода, у меня были мои объекты и мои препятствия, нарисованные на другом растровом изображении. Затем, когда мои hitboxes перекрываются, я сканирую перекрывающиеся пиксели в каждом растровом изображении, и когда я нашел пиксель, который был нарисован как на карте препятствий, так и на карте объекта, произошел а. Это работает, только если вы не беспокоитесь об объектах, сталкивающихся друг с другом. – climbage

+0

a * произошло столкновение, то есть – climbage

1

Я сделал аналогичную вещь несколько лет назад. Каждый объект моей 3D-сцены был составлен из базовых стенных/напольных/потолочных объектов. Каждый объект был сеткой с его собственной ограничивающей сферой. Затем я сначала проверил сферу ботинка моей камеры на ограничивающей сфере каждого объекта для обнаружения столкновения, и если они столкнулись, я выполнил более точный тест столкновения (сетка/сфера).

Это было достаточно быстро (Duron 600 МГц), и это было действительно легко реализовать.

Для вашего сценария у вас, похоже, много динамических объектов (у меня была только камера в моем проекте, как движущийся объект), поэтому она может помочь в использовании каких-то методов разбиения пространства, таких как BSP-деревья квадрантов ,

+0

На самом деле у меня будут стены и препятствия, но, вероятно, только один движущийся объект. –

+0

Итак, каждый объект во втором файле на самом деле статичен? – Stringer

+0

Нет, они двигаются. Но у вас есть только один движущийся объект. –

0

Я предлагаю аппроксимировать оба тела как сферы (коллизионную капсулу) с радиусом R1 и R2.

Если это так, то вам необходимо учесть:

1 - радиус двух тел. В этом случае враг будет точкой радиуса 0, а пуля будет иметь радиус getBulletSize();

2 - Скорость пули и врага во время анимационной рамки находится между 0 < = t < = 1.

Случай столкновения произойдет, когда | r1 + r2 | < d, где d - расстояние между двумя центрами тела.

d задается как P (t) - Q (t), Q и P - центр масс обоих объектов. P (t) = P0 + Vp t. Q (t) = Q0 + Vq t.

Vp = P1 - P0; Vq = Q1 - Q0;

=> д = Р (т) - Q (T)

Решение для случая (R1 + R2)^2 = (Р (т) - Q (T))^2 будет производить время столкновения. Не бойтесь этих формул! Он решает простой многочлен второго порядка, из которого квадратичная формула будет решаться для t. Если B^2> 0 в формулах, первый раз столкновения поверхности происходит, когда время минимально!

Столкновение случаях:

Происходит, если:

1) 0 = < < т = 1.

Предварительная проверка:

2) минимальная д (производная радиуса состояния = 0) должно быть < R1 + R2

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

Смежные вопросы