public GImpactTestDemoSimulation() { CollisionConfiguration = new DefaultCollisionConfiguration(); Dispatcher = new CollisionDispatcher(CollisionConfiguration); //Broadphase = new SimpleBroadphase(); Broadphase = new AxisSweep3_32Bit(new Vector3(-10000, -10000, -10000), new Vector3(10000, 10000, 10000), 1024); World = new DiscreteDynamicsWorld(Dispatcher, Broadphase, null, CollisionConfiguration); GImpactCollisionAlgorithm.RegisterAlgorithm(Dispatcher); _torusShapeData = new TriangleIndexVertexArray(Torus.Indices, Torus.Vertices); _torusShape = CreateGImpactShape(_torusShapeData); _bunnyShapeData = new TriangleIndexVertexArray(Bunny.Indices, Bunny.Vertices); _bunnyShape = CreateGImpactShape(_bunnyShapeData); CreateStaticScene(); CreateTorusChain(); CreateBoxes(); }
/* * Does not set any local variables. Is safe to use to create duplicate physics worlds for independant simulation. */ public bool CreatePhysicsWorld(out CollisionWorld world, out CollisionConfiguration collisionConfig, out CollisionDispatcher dispatcher, out BroadphaseInterface broadphase, out ConstraintSolver solver, out SoftBodyWorldInfo softBodyWorldInfo) { bool success = true; if (m_worldType == WorldType.SoftBodyAndRigidBody && m_collisionType == CollisionConfType.DefaultDynamicsWorldCollisionConf) { Debug.LogError("For World Type = SoftBodyAndRigidBody collisionType must be collisionType=SoftBodyRigidBodyCollisionConf. Switching"); m_collisionType = CollisionConfType.SoftBodyRigidBodyCollisionConf; success = false; } collisionConfig = null; if (m_collisionType == CollisionConfType.DefaultDynamicsWorldCollisionConf) { collisionConfig = new DefaultCollisionConfiguration(); } else if (m_collisionType == CollisionConfType.SoftBodyRigidBodyCollisionConf) { collisionConfig = new SoftBodyRigidBodyCollisionConfiguration(); } dispatcher = new CollisionDispatcher(collisionConfig); if (m_broadphaseType == BroadphaseType.DynamicAABBBroadphase) { broadphase = new DbvtBroadphase(); } else if (m_broadphaseType == BroadphaseType.Axis3SweepBroadphase) { broadphase = new AxisSweep3(m_axis3SweepBroadphaseMin.ToBullet(), m_axis3SweepBroadphaseMax.ToBullet(), axis3SweepMaxProxies); } else if (m_broadphaseType == BroadphaseType.Axis3SweepBroadphase_32bit) { broadphase = new AxisSweep3_32Bit(m_axis3SweepBroadphaseMin.ToBullet(), m_axis3SweepBroadphaseMax.ToBullet(), axis3SweepMaxProxies); } else { broadphase = null; } world = null; softBodyWorldInfo = null; solver = null; if (m_worldType == WorldType.CollisionOnly) { world = new CollisionWorld(dispatcher, broadphase, collisionConfig); } else if (m_worldType == WorldType.RigidBodyDynamics) { switch (solverType) { case SolverType.MLCP: DantzigSolver dtsolver = new DantzigSolver(); solver = new MlcpSolver(dtsolver); break; default: break; } world = new DiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfig); } else if (m_worldType == WorldType.MultiBodyWorld) { MultiBodyConstraintSolver mbConstraintSolver = null; switch (solverType) { /* case SolverType.MLCP: * DantzigSolver dtsolver = new DantzigSolver(); * mbConstraintSolver = new MultiBodyMLCPConstraintSolver(dtsolver); * break;*/ default: mbConstraintSolver = new MultiBodyConstraintSolver(); break; } world = new MultiBodyDynamicsWorld(dispatcher, broadphase, mbConstraintSolver, collisionConfig); } else if (m_worldType == WorldType.SoftBodyAndRigidBody) { SequentialImpulseConstraintSolver siConstraintSolver = new SequentialImpulseConstraintSolver(); constraintSolver = siConstraintSolver; siConstraintSolver.RandSeed = sequentialImpulseConstraintSolverRandomSeed; m_world = new SoftRigidDynamicsWorld(Dispatcher, Broadphase, siConstraintSolver, CollisionConf); _ddWorld = (DiscreteDynamicsWorld)m_world;; SoftRigidDynamicsWorld _sworld = (SoftRigidDynamicsWorld)m_world; m_world.DispatchInfo.EnableSpu = true; _sworld.WorldInfo.SparseSdf.Initialize(); _sworld.WorldInfo.SparseSdf.Reset(); _sworld.WorldInfo.AirDensity = 1.2f; _sworld.WorldInfo.WaterDensity = 0; _sworld.WorldInfo.WaterOffset = 0; _sworld.WorldInfo.WaterNormal = BulletSharp.Math.Vector3.Zero; _sworld.WorldInfo.Gravity = m_gravity.ToBullet(); } if (world is DiscreteDynamicsWorld) { ((DiscreteDynamicsWorld)world).Gravity = m_gravity.ToBullet(); } if (_doDebugDraw) { DebugDrawUnity db = new DebugDrawUnity(); db.DebugMode = _debugDrawMode; world.DebugDrawer = db; } return(success); }
public Physics() { // collision configuration contains default setup for memory, collision setup CollisionConf = new DefaultCollisionConfiguration(); Dispatcher = new CollisionDispatcher(CollisionConf); //Broadphase = new SimpleBroadphase(); Broadphase = new AxisSweep3_32Bit(new Vector3(-10000, -10000, -10000), new Vector3(10000, 10000, 10000), 1024); Solver = new SequentialImpulseConstraintSolver(); World = new DiscreteDynamicsWorld(Dispatcher, Broadphase, Solver, CollisionConf); World.Gravity = new Vector3(0, -10, 0); //create trimesh model and shape InitGImpactCollision(); /// Create Scene float mass = 0.0f; CollisionShape staticboxShape1 = new BoxShape(200, 1, 200);//floor CollisionShapes.Add(staticboxShape1); LocalCreateRigidBody(mass, Matrix.Translation(0, -10, 0), staticboxShape1); CollisionShape staticboxShape2 = new BoxShape(1, 50, 200);//left wall CollisionShapes.Add(staticboxShape2); LocalCreateRigidBody(mass, Matrix.Translation(-200, 15, 0), staticboxShape2); CollisionShape staticboxShape3 = new BoxShape(1, 50, 200);//right wall CollisionShapes.Add(staticboxShape3); LocalCreateRigidBody(mass, Matrix.Translation(200, 15, 0), staticboxShape3); CollisionShape staticboxShape4 = new BoxShape(200, 50, 1);//front wall CollisionShapes.Add(staticboxShape4); LocalCreateRigidBody(mass, Matrix.Translation(0, 15, 200), staticboxShape4); CollisionShape staticboxShape5 = new BoxShape(200, 50, 1);//back wall CollisionShapes.Add(staticboxShape5); LocalCreateRigidBody(mass, Matrix.Translation(0, 15, -200), staticboxShape5); //static plane Vector3 normal = new Vector3(-0.5f, 0.5f, 0.0f); normal.Normalize(); CollisionShape staticplaneShape6 = new StaticPlaneShape(normal, 0.5f);// A plane CollisionShapes.Add(staticplaneShape6); RigidBody staticBody2 = LocalCreateRigidBody(mass, Matrix.Translation(0, -9, 0), staticplaneShape6); //another static plane normal = new Vector3(0.5f, 0.7f, 0.0f); //normal.Normalize(); CollisionShape staticplaneShape7 = new StaticPlaneShape(normal, 0.0f);// A plane CollisionShapes.Add(staticplaneShape7); staticBody2 = LocalCreateRigidBody(mass, Matrix.Translation(0, -10, 0), staticplaneShape7); /// Create Static Torus float height = 28; float step = 2.5f; float massT = 1.0f; Matrix startTransform = Matrix.RotationQuaternion(Quaternion.RotationYawPitchRoll((float)Math.PI * 0.5f, 0, (float)Math.PI * 0.5f)) * Matrix.Translation(0, height, -5); #if BULLET_GIMPACT kinematicTorus = LocalCreateRigidBody(0, startTransform, trimeshShape); #else //kinematicTorus = LocalCreateRigidBody(0, startTransform, CreateTorusShape()); #endif //kinematicTorus.CollisionFlags = kinematicTorus.CollisionFlags | CollisionFlags.StaticObject; //kinematicTorus.ActivationState = ActivationState.IslandSleeping; kinematicTorus.CollisionFlags = kinematicTorus.CollisionFlags | CollisionFlags.KinematicObject; kinematicTorus.ActivationState = ActivationState.DisableDeactivation; // Kinematic kinTorusTran = new Vector3(-0.1f, 0, 0); kinTorusRot = Quaternion.RotationYawPitchRoll(0, (float)Math.PI * 0.01f, 0); #if TEST_GIMPACT_TORUS #if BULLET_GIMPACT // Create dynamic Torus for (int i = 0; i < 6; i++) { height -= step; startTransform = Matrix.RotationQuaternion(Quaternion.RotationYawPitchRoll(0, 0, (float)Math.PI * 0.5f)) * Matrix.Translation(0, height, -5); RigidBody bodyA = LocalCreateRigidBody(massT, startTransform, trimeshShape); height -= step; startTransform = Matrix.RotationQuaternion(Quaternion.RotationYawPitchRoll((float)Math.PI * 0.5f, 0, (float)Math.PI * 0.5f)) * Matrix.Translation(0, height, -5); RigidBody bodyB = LocalCreateRigidBody(massT, startTransform, trimeshShape); } #else /* * // Create dynamic Torus * for (int i = 0; i < 6; i++) * { * height -= step; * startTransform.setOrigin(btVector3(0, height, -5)); * startTransform.setRotation(btQuaternion(0, 0, 3.14159265 * 0.5)); * * btRigidBody* bodyA = localCreateRigidBody(massT, startTransform, createTorusShape()); * * height -= step; * startTransform.setOrigin(btVector3(0, height, -5)); * startTransform.setRotation(btQuaternion(3.14159265 * 0.5, 0, 3.14159265 * 0.5)); * btRigidBody* bodyB = localCreateRigidBody(massT, startTransform, createTorusShape()); * } */ #endif #endif // Create Dynamic Boxes for (int i = 0; i < 8; i++) { CollisionShape boxShape = new BoxShape(new Vector3(1, 1, 1)); CollisionShapes.Add(boxShape); LocalCreateRigidBody(1, Matrix.Translation(2 * i - 5, 2, -3), boxShape); } }
//Does not set any local variables. Is safe to use to create duplicate physics worlds for independant simulation. public void CreatePhysicsWorld ( out CollisionWorld world, out CollisionConfiguration collisionConfig, out CollisionDispatcher dispatcher, out BroadphaseInterface broadphase, out ConstraintSolver solver, out SoftBodyWorldInfo softBodyWorldInfo ) { collisionConfig = null; switch (physicWorldParameters.collisionType) { default: case CollisionConfType.DefaultDynamicsWorldCollisionConf: collisionConfig = new DefaultCollisionConfiguration(); break; case CollisionConfType.SoftBodyRigidBodyCollisionConf: collisionConfig = new SoftBodyRigidBodyCollisionConfiguration(); break; } dispatcher = new CollisionDispatcher(collisionConfig); switch (physicWorldParameters.broadphaseType) { default: case BroadphaseType.DynamicAABBBroadphase: broadphase = new DbvtBroadphase(); break; case BroadphaseType.Axis3SweepBroadphase: broadphase = new AxisSweep3( physicWorldParameters.axis3SweepBroadphaseMin, physicWorldParameters.axis3SweepBroadphaseMax, physicWorldParameters.axis3SweepMaxProxies ); break; case BroadphaseType.Axis3SweepBroadphase_32bit: broadphase = new AxisSweep3_32Bit( physicWorldParameters.axis3SweepBroadphaseMin, physicWorldParameters.axis3SweepBroadphaseMax, physicWorldParameters.axis3SweepMaxProxies ); break; } world = null; softBodyWorldInfo = null; solver = null; switch (physicWorldParameters.worldType) { case WorldType.CollisionOnly: world = new CollisionWorld(dispatcher, broadphase, collisionConfig); break; default: case WorldType.RigidBodyDynamics: world = new DiscreteDynamicsWorld(dispatcher, broadphase, null, collisionConfig); break; case WorldType.MultiBodyWorld: MultiBodyConstraintSolver mbConstraintSolver = new MultiBodyConstraintSolver(); constraintSolver = mbConstraintSolver; world = new MultiBodyDynamicsWorld(dispatcher, broadphase, mbConstraintSolver, collisionConfig); break; case WorldType.SoftBodyAndRigidBody: SequentialImpulseConstraintSolver siConstraintSolver = new SequentialImpulseConstraintSolver(); constraintSolver = siConstraintSolver; siConstraintSolver.RandSeed = physicWorldParameters.sequentialImpulseConstraintSolverRandomSeed; world = new SoftRigidDynamicsWorld(this.dispatcher, this.broadphase, siConstraintSolver, collisionConf); world.DispatchInfo.EnableSpu = true; SoftRigidDynamicsWorld _sworld = (SoftRigidDynamicsWorld)world; _sworld.WorldInfo.SparseSdf.Initialize(); _sworld.WorldInfo.SparseSdf.Reset(); _sworld.WorldInfo.AirDensity = 1.2f; _sworld.WorldInfo.WaterDensity = 0; _sworld.WorldInfo.WaterOffset = 0; _sworld.WorldInfo.WaterNormal = BulletSharp.Math.Vector3.Zero; _sworld.WorldInfo.Gravity = Gravity.ToBullet(); break; } if (world is DiscreteDynamicsWorld) { ((DiscreteDynamicsWorld)world).Gravity = Gravity.ToBullet(); } }
private void CreateWorld() { if (physicWorldParameters.worldType == WorldType.SoftBodyAndRigidBody && physicWorldParameters.collisionType != CollisionConfType.SoftBodyRigidBodyCollisionConf) { Debug.LogError("For World Type = SoftBodyAndRigidBody collisionType must be collisionType = SoftBodyRigidBodyCollisionConf."); return; } isDisposed = false; switch (physicWorldParameters.collisionType) { case CollisionConfType.DefaultDynamicsWorldCollisionConf: collisionConf = new DefaultCollisionConfiguration(); break; case CollisionConfType.SoftBodyRigidBodyCollisionConf: collisionConf = new SoftBodyRigidBodyCollisionConfiguration(); break; } dispatcher = new CollisionDispatcher(collisionConf); switch (physicWorldParameters.broadphaseType) { default: case BroadphaseType.DynamicAABBBroadphase: broadphase = new DbvtBroadphase(); break; case BroadphaseType.Axis3SweepBroadphase: broadphase = new AxisSweep3(physicWorldParameters.axis3SweepBroadphaseMin, physicWorldParameters.axis3SweepBroadphaseMax, physicWorldParameters.axis3SweepMaxProxies); break; case BroadphaseType.Axis3SweepBroadphase_32bit: broadphase = new AxisSweep3_32Bit(physicWorldParameters.axis3SweepBroadphaseMin, physicWorldParameters.axis3SweepBroadphaseMax, physicWorldParameters.axis3SweepMaxProxies); break; } switch (physicWorldParameters.worldType) { case WorldType.CollisionOnly: World = new CollisionWorld(dispatcher, broadphase, collisionConf); break; case WorldType.RigidBodyDynamics: World = new DiscreteDynamicsWorld(dispatcher, broadphase, null, collisionConf); break; case WorldType.MultiBodyWorld: MultiBodyConstraintSolver mbConstraintSolver = new MultiBodyConstraintSolver(); constraintSolver = mbConstraintSolver; World = new MultiBodyDynamicsWorld(dispatcher, broadphase, mbConstraintSolver, collisionConf); break; case WorldType.SoftBodyAndRigidBody: SequentialImpulseConstraintSolver siConstraintSolver = new SequentialImpulseConstraintSolver(); constraintSolver = siConstraintSolver; siConstraintSolver.RandSeed = physicWorldParameters.sequentialImpulseConstraintSolverRandomSeed; World = new SoftRigidDynamicsWorld(dispatcher, broadphase, siConstraintSolver, collisionConf); _world.DispatchInfo.EnableSpu = true; SoftWorld.WorldInfo.SparseSdf.Initialize(); SoftWorld.WorldInfo.SparseSdf.Reset(); SoftWorld.WorldInfo.AirDensity = 1.2f; SoftWorld.WorldInfo.WaterDensity = 0; SoftWorld.WorldInfo.WaterOffset = 0; SoftWorld.WorldInfo.WaterNormal = BulletSharp.Math.Vector3.Zero; SoftWorld.WorldInfo.Gravity = physicWorldParameters.gravity; break; } if (_world is DiscreteDynamicsWorld) { ((DiscreteDynamicsWorld)_world).Gravity = physicWorldParameters.gravity; } Debug.LogFormat("Physic World of type {0} Instanced", physicWorldParameters.worldType); if (physicWorldParameters.debug) { Debug.Log("Physic World Debug is active"); DebugDrawUnity db = new DebugDrawUnity(); db.DebugMode = physicWorldParameters.debugDrawMode; _world.DebugDrawer = db; } }