Физический движок с несколькими группами объектов
Моему java-приложению требуется физический движок 2d для горизонтального мира, однако, глядя на jbox2d и dyn4j, кажется, что они не предлагают то, что мне нужно, из коробки. В частности, они не поддерживают определение, какие группы объектов могут сталкиваться с другими. Рассмотрим эту упрощенную модель: пули могут сталкиваться с коробками. Самолеты проходят через ящики, но могут сталкиваться с пулями.
Как исключить столкновение определенных групп объектов в физическом движке?
1 ответ
Существует решение в box2d (и jbox2d соответственно). Метод "PreSolve" позволяет отключить контакт перед столкновением. Посмотрите этот вопрос на gamedev, который имеет почти такую же проблему, как описано здесь.
Из документации:
Предварительное решение события
Это вызывается после обнаружения столкновения, но до разрешения столкновения. Это дает вам возможность отключить контакт в зависимости от текущей конфигурации. Например, вы можете реализовать одностороннюю платформу, используя этот обратный вызов и вызывая b2Contact::SetEnabled(false). Контакт будет повторно активироваться каждый раз при обработке коллизий, поэтому вам нужно будет отключать контакт каждый шаг по времени. Событие предварительного решения может запускаться несколько раз за шаг по времени на контакт из-за непрерывного обнаружения столкновений.
У Dyn4j есть CategoryFilter. Вы создаете CategoryFilters с двумя значениями long и устанавливаете их в своих приборах. Немного забавно, как работают фильтры, потому что категория и маска используются в их двоичных формах, чтобы определить, кто может столкнуться с кем. Чтобы увидеть это на практике, посмотрите этот @Test из репозитория Dyn4j. Dyn4j также упоминает это в документах:
Предусмотрено три реализации Filter: Filter.DEFAULT_FILTER, CategoryFilter (точно так же, как фильтр столкновений Box2D, int category + mask) и TypeFilter.
Таким образом, я предполагаю, что Box2D имеет это тоже (и jBox2d по расширению). Я бы сказал, что любой физический движок на уровне Box2D или Dyn4j будет иметь эту способность в той или иной форме.