使用 Bullet 和 LibGDX 检测 btCompoundShape 与 btSphereShape 的碰撞
Detect collision of btCompoundShape with btSphereShape with Bullet and LibGDX
我正在尝试检测 btCompountShape
和 btSphereShape
与 LibGDX
项目中使用的 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
方法。
我正在尝试检测 btCompountShape
和 btSphereShape
与 LibGDX
项目中使用的 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
方法。