LibGDX - Bullet - 3D碰撞检测未检测到碰撞

时间:2018-05-08 00:35:48

标签: java libgdx bullet

我正在尝试使用Bullet进行3D碰撞测试,我原本希望它能够相当简单地工作:

@Override
public void create(){
   . . .
   /*
    * Collision
    */

   collisionConfig=new btDefaultCollisionConfiguration();
   dispatcher=new btCollisionDispatcher(collisionConfig);
   broadphase=new btDbvtBroadphase();
   world=new btCollisionWorld(dispatcher, broadphase, collisionConfig);
   contactListener=new PiscesContactListener();
   contactListener.enable();

   /*
    * Test stuff
    */

   btSphereShape sphere=new btSphereShape(2.5f);
   btCollisionObject object1=new btCollisionObject();
   btCollisionObject object2=new btCollisionObject();
   object1.setCollisionShape(sphere);
   object2.setCollisionShape(sphere);
   object1.setWorldTransform(new Matrix4(new Vector3(0f, 0f, 0f), new Quaternion(0f, 0f, 0f, 0f), new Vector3(1f, 1f, 1f)));
   object2.setWorldTransform(new Matrix4(new Vector3(1f, 0f, 0f), new Quaternion(0f, 0f, 0f, 0f), new Vector3(1f, 1f, 1f)));
   object1.setUserValue(0);
   object2.setUserValue(1);
   object1.setCollisionFlags(WorldObject.COLLISION_PRIMARY);   // 1<<9
   object2.setCollisionFlags(WorldObject.COLLISION_PRIMARY);
   world.addCollisionObject(object1, WorldObject.COLLISION_PRIMARY, WorldObject.COLLISION_EVERYTHING);   // -1
   world.addCollisionObject(object2, WorldObject.COLLISION_PRIMARY, WorldObject.COLLISION_EVERYTHING);
   . . .
}

@Override
public void render() {
   . . .
   world.performDiscreteCollisionDetection();
   . . .
}

/*
 * In a separate file
 */
public class PiscesContactListener extends ContactListener {   
    public boolean onContactAdded (int userValue0, int partId0, int index0, boolean match0, int userValue1, int partId1, int index1, boolean match1) {
        System.out.println("Collision detected between "+userValue0+" and "+userValue1);
        return true;
    }
}

(我跟着this指南,虽然我显然偏离了它,试图让它变得更简单。)

在(0,0,0)处的2.5单位球体和在(1,0,0)处的2.5单位球体应该导致碰撞,如果不是?控制台窗口中没有任何内容。

我有点怀疑我忘记了一些基本的东西,因为我试图做raycast但这也没有用。

值得一提的是,调用world.drawDebugWorld();会绘制所有对象所需的线框,所以现在我怀疑错误在于联系人监听器或者我正在使用的标志(虽然我没有任何其他碰撞标志的运气)。我在联系人监听器中遗漏了什么吗?

此外,我尝试使用ContactCache代替ContactListener,但这也不起作用。大多数阅读我都能在这个问题上找到关于ContactListener的讨论,所以我最好还是可以使用它。

我显然忘记了某些事情,因为其他人能够做到这一点,任何人都可以指出这可能是什么?

0 个答案:

没有答案