使用Bullet和LibGDX检测btCompoundShape与btSphereShape的冲突

时间:2015-06-29 19:03:34

标签: libgdx collision-detection bullet

我正在尝试使用btCompountShape项目中使用的btSphereShape库来检测BulletLibGDX之间的冲突。

我的检测方法如下:

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。为什么?我能做些什么才能让它发挥作用?

1 个答案:

答案 0 :(得分:3)

btCompoundShape是多种形状的复合物。对于多个形状,没有一种算法。你需要一个针对球体的每个形状的算法。

话虽如此,你甚至不应该关心这一点,因为碰撞世界会照顾你。看起来你在我的教程中停了下来。 checkCollision方法仅用作示例。告诉你发生了什么。不要实际使用它。

检查https://xoppa.github.io/blog/using-the-libgdx-3d-physics-bullet-wrapper-part1/,确保阅读整个教程,不要在中间停止。稍后在本教程中,我将向您展示如何使用碰撞世界,并删除checkCollision方法。