JBullet – 检测两个物体相撞的时间?

如何检测两个碰撞物体与JBullet碰撞? 目前,所有身体types将是RigidBodytypes。 我真的一直试图find这个问题的答案超过2个月,如果有人能帮助我,我将非常感激。

有一些关于碰撞callback的随机的东西,但似乎从来没有工作 – 或者是缺less类,或者代码只是不做我想做的事情(或者是像“检查每个单击碰撞对象”这样的愚蠢行为这个),还有其他的事情,这意味着我从来没有得到我的问题的答案。

我需要知道这个,让船和炮弹能够碰撞和爆炸。 游戏完全可以玩,手动实现了碰撞检测,但占用了I7 CPU的50%以上 – 太多了。

谢谢,如果你能回答我的问题。

PS JBullet正在我的服务器上使用,而不是我的客户端。

碰撞callback在http://www.bulletphysics.org/mediawiki-1.5.8/index.php?title=Collision_Callbacks_and_Triggers中解释。 这转换相当简单JBullet。 但是,如果您已经尝试过并且没有遵循这个规则,那么我只会提供我自己使用的代码。

首先设置一个在每次物理迭代中调用的callback:

dynamicsWorld.setInternalTickCallback(new InternalTickCallback() { @Override public void internalTick(DynamicsWorld dynamicsWorld, float timeStep) { // Add your collision checks or other functionality here. } }, null); 

要检测碰撞,您需要迭代internalTickcallback中的所有碰撞联系人:

 Dispatcher dispatcher = dynamicsWorld.getDispatcher(); int manifoldCount = dispatcher.getNumManifolds(); for (int i = 0; i < manifoldCount; i++) { PersistentManifold manifold = dispatcher.getManifoldByIndexInternal(i); // The following two lines are optional. RigidBody object1 = (RigidBody)manifold.getBody0(); RigidBody object2 = (RigidBody)manifold.getBody1(); MyPhysicsObject physicsObject1 = (MyPhysicsObject)object1.getUserPointer(); MyPhysicsObject physicsObject2 = (MyPhysicsObject)object2.getUserPointer(); boolean hit = false; Vector3f normal = null; for (int j = 0; j < manifold.getNumContacts(); j++) { ManifoldPoint contactPoint = manifold.getContactPoint(j); if (contactPoint.getDistance() < 0.0f) { hit = true; normal = contactPoint.normalWorldOnB; break; } } if (hit) { // Collision happened between physicsObject1 and physicsObject2. Collision normal is in variable 'normal'. } } 

我已经使用CollisionObject.setUserPointer()为每个JBullet RigidBody指定了自己的对象指针。 在碰撞callback中,我可以使用MyPhysicsObject physicsObject1 = (MyPhysicsObject)object1.getUserPointer();