【发布时间】:2018-05-08 00:35:47
【问题描述】:
我正在尝试使用 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,所以我最好还是使用它。
我显然忘记了一些事情,因为其他人能够做到这一点,有人能指出那可能是什么吗?
【问题讨论】: