使用 Bullet 和 LibGDX 检测 btCompoundShape 与 btSphereShape 的碰撞

Detect collision of btCompoundShape with btSphereShape with Bullet and LibGDX

我正在尝试检测 btCompountShapebtSphereShapeLibGDX 项目中使用的 Bullet 库之间的冲突。

我的检测方法是这样的:

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.run(LwjglApplication.java:114)

我检查过 result.getPersistentManifold returns 为空。为什么?我该怎么做才能让它发挥作用?

一个btCompoundShape是多个形状的复合体。没有一种算法适用于多种形状。您需要针对球体构成的每个形状的算法。

话虽这么说,但您根本不必关心这个,因为碰撞世界会为您处理好这些。看起来你在我的教程中间停了下来。 checkCollision 方法仅作为示例。向您展示发生了什么。不要实际使用它。

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