2014-03-03 5 views
2

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

Скажем, например, у меня есть два квадрата. squareA и squareB. Для них обоих я знаю их xCo, yCo, width и height. squareA движется однако, поэтому он имеет скорость magnitude и скорость angle. Давайте сделаем вид, что обновляю игру раз в секунду. Я проиллюстрировал ситуацию ниже.

shapes before movement

shapes after movement

Теперь мне нужна формула, чтобы получить вектор для фиксации перекрытия. Если я применил этот вектор на красный квадрат (squareA), они больше не должны перекрываться. Это то, чего я хочу достичь.

enter image description here

Может кто-нибудь помочь мне выяснить формулу для расчета вектора?

Бонусные баллы, если они построены на Java.

Бонусные бонусные баллы, если вы выберете ответ вместо ссылки на учебник по обнаружению столкновения.

Спасибо, ребята!

Также, как рассчитать новую скорость magnitude и angle? Я хотел бы sqaureA продолжить движение вдоль оси х (скольжение по верхней части синий квадрат)

+0

Вам действительно нужно сделать это настолько точной и сложной? Общий подход заключается в том, чтобы «попытаться» сделать еще один шаг, если произойдет столкновение. Если это так, вы просто остановите объект, который движется. Он используется даже во многих известных и инди-играх. – libik

+0

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

+0

правда, но как я сказал, я сделал это так, как я сказал, это было не идеально, но это было достаточно хорошо. А потом, когда я играл в игры, я был удивлен, насколько знаменитые игры использовали точно такой же подход :). – libik

ответ

0

Я имел функцию, которая выглядела примерно так:

Position calculateValidPosition(Position start, Position end) 
    Position middlePoint = (start + end) /2 

    if (middlePoint == start || middlePoint == end) 
     return start 

    if(isColliding(middlePont)) 
     return calculateValidPosition(start, middlePoint) 
    else 
     return calculate(middlePoint, end) 

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

Эта функция будет вызываться при обнаружении столкновения, передавая в качестве параметра последнюю действительную позицию объекта и текущую недействительную позицию. На каждой итерации первый параметр всегда действителен (без коллизии), а второй - недействителен (есть коллизия).

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

0

Ваш вопрос, как указано, требует ответа, который является вашим приложением. Но простой ответ достаточно прост.

  1. Вам нужно разметить пространство с четырехъядерными деревьев
  2. Вы, кажется, показывают, что только один объект будет смещаться, когда столкновение обнаружено. (Для случая нескольких взаимопроникающих объектов просто исправьте каждую пару объектов в наборе до тех пор, пока они не перекрываются.)
  3. Ни эластичное, ни неупругое столкновение не является желательным. Вам нужна простая проекция горизонтальной скорости (квадрата А), поэтому Vx (t-1) = Vx (t + 1), Vy (t-1) не имеет значения, а Vy (t + 1) = 0. Здесь t - время столкновения.
  4. Перестановка площади A проста.
    • Определить Cn как вектор от центра тяжести A до вершины n (где обозначение вершин произвольно).
    • Определить A (T-1) в качестве прежнего направления А.
    • Определить Dn как скалярное произведение А (Т-1) и вектора Cn
    • Определить Rn как ширина, измеренная вдоль Cn (и проходящей мимо центра тяжести в противоположном направлении).
    • Определить Sn как расширение B радиусом Rn.
    • Пусть j - вершина B с наивысшим значением y.
    • Пусть k - это вершина, наиболее близкая к переднему углу A [в интуитивном смысле, где значение Dn указывает, что Ck наиболее близко к A (t-1)].
    • Пусть K - антиподальный край или вершина A относительно k.

Наконец, перевести так, что к и J совпадают и K совпадает с Sk.

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