我正在尝试使用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
返回null。为什么?我能做些什么才能让它发挥作用?
答案 0 :(得分:3)
btCompoundShape
是多种形状的复合物。对于多个形状,没有一种算法。你需要一个针对球体的每个形状的算法。
话虽如此,你甚至不应该关心这一点,因为碰撞世界会照顾你。看起来你在我的教程中停了下来。 checkCollision
方法仅用作示例。告诉你发生了什么。不要实际使用它。
检查https://xoppa.github.io/blog/using-the-libgdx-3d-physics-bullet-wrapper-part1/,确保阅读整个教程,不要在中间停止。稍后在本教程中,我将向您展示如何使用碰撞世界,并删除checkCollision
方法。