Обнаружение столкновения 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
метод удален