Java源码示例:com.bulletphysics.collision.dispatch.CollisionDispatcher
示例1
public PhysicsWorldJBullet(final boolean gravity) {
// collision configuration contains default setup for memory, collision
// setup. Advanced users can create their own configuration.
final CollisionConfiguration collisionConfiguration = new DefaultCollisionConfiguration();
// use the default collision dispatcher. For parallel processing you
// can use a diffent dispatcher (see Extras/BulletMultiThreaded)
final CollisionDispatcher dispatcher = new CollisionDispatcher(collisionConfiguration);
// the maximum size of the collision world. Make sure objects stay
// within these boundaries
// Don't make the world AABB size too large, it will harm simulation
// quality and performance
final Vector3f worldAabbMin = new Vector3f(-10000, -10000, -10000);
final Vector3f worldAabbMax = new Vector3f(10000, 10000, 10000);
final AxisSweep3_32 overlappingPairCache = new AxisSweep3_32(worldAabbMin, worldAabbMax, MAX_OBJECTS);
final SequentialImpulseConstraintSolver solver = new SequentialImpulseConstraintSolver();
dynamicsWorld = new DiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConfiguration);
if (gravity == true) {
dynamicsWorld.setGravity(new Vector3f(0.0f, 0.0f, -9.81f));
} else {
dynamicsWorld.setGravity(new Vector3f(0.0f, 0.0f, 0.0f));
}
}
示例2
/**
* Has to be called from the (designated) physics thread
*/
public void create() {
pQueueTL.set(pQueue);
collisionConfiguration = new DefaultCollisionConfiguration();
dispatcher = new CollisionDispatcher(collisionConfiguration);
switch (broadphaseType) {
case SIMPLE:
broadphase = new SimpleBroadphase();
break;
case AXIS_SWEEP_3:
broadphase = new AxisSweep3(Converter.convert(worldMin), Converter.convert(worldMax));
break;
case AXIS_SWEEP_3_32:
broadphase = new AxisSweep3_32(Converter.convert(worldMin), Converter.convert(worldMax));
break;
case DBVT:
broadphase = new DbvtBroadphase();
break;
}
solver = new SequentialImpulseConstraintSolver();
dynamicsWorld = new DiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
dynamicsWorld.setGravity(new javax.vecmath.Vector3f(0, -9.81f, 0));
broadphase.getOverlappingPairCache().setInternalGhostPairCallback(new GhostPairCallback());
GImpactCollisionAlgorithm.registerAlgorithm(dispatcher);
physicsSpaceTL.set(this);
//register filter callback for tick / collision
setTickCallback();
setContactCallbacks();
//register filter callback for collision groups
setOverlapFilterCallback();
}
示例3
/**
* Has to be called from the (designated) physics thread
*/
public void create() {
pQueueTL.set(pQueue);
collisionConfiguration = new DefaultCollisionConfiguration();
dispatcher = new CollisionDispatcher(collisionConfiguration);
switch (broadphaseType) {
case SIMPLE:
broadphase = new SimpleBroadphase();
break;
case AXIS_SWEEP_3:
broadphase = new AxisSweep3(Converter.convert(worldMin), Converter.convert(worldMax));
break;
case AXIS_SWEEP_3_32:
broadphase = new AxisSweep3_32(Converter.convert(worldMin), Converter.convert(worldMax));
break;
case DBVT:
broadphase = new DbvtBroadphase();
break;
}
solver = new SequentialImpulseConstraintSolver();
dynamicsWorld = new DiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
dynamicsWorld.setGravity(new javax.vecmath.Vector3f(0, -9.81f, 0));
broadphase.getOverlappingPairCache().setInternalGhostPairCallback(new GhostPairCallback());
GImpactCollisionAlgorithm.registerAlgorithm(dispatcher);
physicsSpaceTL.set(this);
//register filter callback for tick / collision
setTickCallback();
setContactCallbacks();
//register filter callback for collision groups
setOverlapFilterCallback();
}
示例4
public static void main(String[] args) {
BroadphaseInterface broadphase = new DbvtBroadphase();
DefaultCollisionConfiguration collisionConfiguration = new DefaultCollisionConfiguration();
CollisionDispatcher dispatcher = new CollisionDispatcher(collisionConfiguration);
SequentialImpulseConstraintSolver solver = new SequentialImpulseConstraintSolver();
DiscreteDynamicsWorld dynamicsWorld = new DiscreteDynamicsWorld(dispatcher, broadphase, solver,
collisionConfiguration);
// set the gravity of our world
dynamicsWorld.setGravity(new Vector3f(0, -10, 0));
// setup our collision shapes
CollisionShape groundShape = new StaticPlaneShape(new Vector3f(0, 1, 0), 1);
CollisionShape fallShape = new SphereShape(1);
// setup the motion state
DefaultMotionState groundMotionState = new DefaultMotionState(
new Transform(new Matrix4f(new Quat4f(0, 0, 0, 1), new Vector3f(0, -1, 0), 1.0f)));
RigidBodyConstructionInfo groundRigidBodyCI = new RigidBodyConstructionInfo(0, groundMotionState, groundShape,
new Vector3f(0, 0, 0));
RigidBody groundRigidBody = new RigidBody(groundRigidBodyCI);
dynamicsWorld.addRigidBody(groundRigidBody); // add our ground to the
// dynamic world..
// setup the motion state for the ball
DefaultMotionState fallMotionState = new DefaultMotionState(
new Transform(new Matrix4f(new Quat4f(0, 0, 0, 1), new Vector3f(0, 100, 0), 1.0f)));
// This we're going to give mass so it responds to gravity
int mass = 1;
Vector3f fallInertia = new Vector3f(0, 0, 0);
fallShape.calculateLocalInertia(mass, fallInertia);
RigidBodyConstructionInfo fallRigidBodyCI = new RigidBodyConstructionInfo(mass, fallMotionState, fallShape,
fallInertia);
RigidBody fallRigidBody = new RigidBody(fallRigidBodyCI);
// now we add it to our physics simulation
dynamicsWorld.addRigidBody(fallRigidBody);
for (int i = 0; i < 300; i++) {
dynamicsWorld.stepSimulation(1 / 60.f, 10);
Transform trans = new Transform();
fallRigidBody.getMotionState().getWorldTransform(trans);
System.out.println("sphere height: " + trans.origin.y);
}
}