Пример #1
0
        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();
        }
Пример #2
0
        /*
         * 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);
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
    //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();
        }
    }
Пример #5
0
    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;
        }
    }