Обнаружение столкновения btCompoundShape с btSphereShape с помощью Bullet и LibGDX

Я пытаюсь обнаружить столкновение между btCompountShape а также btSphereShape с Bullet библиотека используется в LibGDX проект.

Мой метод обнаружения выглядит так:

def checkCollision(left: btCollisionObject, right: btCollisionObject) = {
  val leftWrapper = new CollisionObjectWrapper(left)
  val rightWrapper = new CollisionObjectWrapper(right)

  val algorithm = collisionDispatcher.findAlgorithm(leftWrapper.wrapper, rightWrapper.wrapper)

  val info = new btDispatcherInfo()
  val result = new btManifoldResult(leftWrapper.wrapper, rightWrapper.wrapper)

  algorithm.processCollision(leftWrapper.wrapper, rightWrapper.wrapper, info, result)

  val r = result.getPersistentManifold.getNumContacts > 0

  result.dispose()
  info.dispose()
  algorithm.dispose()
  leftWrapper.dispose()
  rightWrapper.dispose()

  r
} 

Он отлично работает, когда я использую его для обнаружения столкновения между двумя btSphereShape объекты. Но когда я прохожу тот, который btCompoundShape это терпит неудачу. Для тестирования я создал свой btCompoundShape только с одной дочерней формой, а именно простой btSphereShape, Сбой со следующей ошибкой:

Exception in thread "LWJGL Application" java.lang.NullPointerException
  at com.game.CollisionDetector$class.checkCollision(CollisionDetector.scala:19)
  at com.game.SmlPwsat2Game.checkCollision(SmlPwsat2Game.scala:14)
  at com.game.SmlPwsat2Game.render(SmlPwsat2Game.scala:87)
  at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:207)
  at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)

Я проверил это result.getPersistentManifold возвращает ноль. Зачем? И что я могу сделать, чтобы это работало?

1 ответ

Решение

btCompoundShape это соединение нескольких форм. Не существует такого понятия, как один алгоритм для нескольких фигур. Вам нужен алгоритм для каждой фигуры, из которой он сделан, относительно сферы.

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

Проверьте https://xoppa.github.io/blog/using-the-libgdx-3d-physics-bullet-wrapper-part1/, обязательно прочитайте весь учебник, не останавливайтесь на середине. Позже в этом уроке я покажу вам, как использовать мир столкновений и checkCollision метод удален

Другие вопросы по тегам