我正在尝试使用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
的讨论,所以我最好还是可以使用它。
我显然忘记了某些事情,因为其他人能够做到这一点,任何人都可以指出这可能是什么?