コード例 #1
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)
            {
                world = new DiscreteDynamicsWorld(dispatcher, broadphase, null, collisionConfig);
            }
            else if (m_worldType == WorldType.MultiBodyWorld)
            {
                MultiBodyConstraintSolver mbConstraintSolver = new MultiBodyConstraintSolver();
                constraintSolver = mbConstraintSolver;
                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);
        }
コード例 #2
0
        public SoftBody GetSoftBody(SoftBodyWorldInfo si)
        {
            SoftBody body = this.CreateSoftBody(si);

            return(body);
        }
コード例 #3
0
 protected abstract SoftBody CreateSoftBody(SoftBodyWorldInfo si);
コード例 #4
0
        public static SoftBody CreateFromTetGenData(SoftBodyWorldInfo worldInfo,
                                                    string ele, string face, string node, bool faceLinks, bool tetraLinks, bool facesFromTetras)
        {
            CultureInfo culture = CultureInfo.InvariantCulture;

            char[]    separator = new[] { ' ' };
            Vector3[] pos;

            using (var nodeReader = new StringReader(node))
            {
                string[] nodeHeader = nodeReader.ReadLine().Split(separator, StringSplitOptions.RemoveEmptyEntries);
                int      numNodes   = int.Parse(nodeHeader[0]);
                //int numDims = int.Parse(nodeHeader[1]);
                //int numAttrs = int.Parse(nodeHeader[2]);
                //bool hasBounds = !nodeHeader[3].Equals("0");

                pos = new Vector3[numNodes];
                for (int n = 0; n < numNodes; n++)
                {
                    string[] nodeLine = nodeReader.ReadLine().Split(separator, StringSplitOptions.RemoveEmptyEntries);
                    pos[int.Parse(nodeLine[0])] = new Vector3(
                        double.Parse(nodeLine[1], culture),
                        double.Parse(nodeLine[2], culture),
                        double.Parse(nodeLine[3], culture));
                }
            }
            var psb = new SoftBody(worldInfo, pos.Length, pos, null);

            /*
             * if (!string.IsNullOrEmpty(face))
             * {
             *      throw new NotImplementedException();
             * }
             */
            if (!string.IsNullOrEmpty(ele))
            {
                using (var eleReader = new StringReader(ele))
                {
                    string[] eleHeader = eleReader.ReadLine().Split(separator, StringSplitOptions.RemoveEmptyEntries);
                    int      numTetras = int.Parse(eleHeader[0]);
                    //int numCorners = int.Parse(eleHeader[1]);
                    //int numAttrs = int.Parse(eleHeader[2]);

                    for (int n = 0; n < numTetras; n++)
                    {
                        string[] eleLine = eleReader.ReadLine().Split(separator, StringSplitOptions.RemoveEmptyEntries);
                        //int index = int.Parse(eleLine[0], culture);
                        int ni0 = int.Parse(eleLine[1], culture);
                        int ni1 = int.Parse(eleLine[2], culture);
                        int ni2 = int.Parse(eleLine[3], culture);
                        int ni3 = int.Parse(eleLine[4], culture);
                        psb.AppendTetra(ni0, ni1, ni2, ni3);
                        if (tetraLinks)
                        {
                            psb.AppendLink(ni0, ni1, null, true);
                            psb.AppendLink(ni1, ni2, null, true);
                            psb.AppendLink(ni2, ni0, null, true);
                            psb.AppendLink(ni0, ni3, null, true);
                            psb.AppendLink(ni1, ni3, null, true);
                            psb.AppendLink(ni2, ni3, null, true);
                        }
                    }
                }
            }

            //Console.WriteLine("Nodes: {0}", psb.Nodes.Count);
            //Console.WriteLine("Links: {0}", psb.Links.Count);
            //Console.WriteLine("Faces: {0}", psb.Faces.Count);
            //Console.WriteLine("Tetras: {0}", psb.Tetras.Count);

            return(psb);
        }
コード例 #5
0
        public static SoftBody CreatePatch(SoftBodyWorldInfo worldInfo, Vector3 corner00,
                                           Vector3 corner10, Vector3 corner01, Vector3 corner11, int resolutionX, int resolutionY,
                                           int fixedCorners, bool generateDiagonals)
        {
            // Create nodes
            if ((resolutionX < 2) || (resolutionY < 2))
            {
                return(null);
            }

            int rx        = resolutionX;
            int ry        = resolutionY;
            int total     = rx * ry;
            var positions = new Vector3[total];
            var masses    = new double[total];

            for (int y = 0; y < ry; y++)
            {
                double  ty = y / (double)(ry - 1);
                Vector3 py0, py1;
                Vector3.Lerp(ref corner00, ref corner01, ty, out py0);
                Vector3.Lerp(ref corner10, ref corner11, ty, out py1);
                for (int ix = 0; ix < rx; ix++)
                {
                    double tx    = ix / (double)(rx - 1);
                    int    index = rx * y + ix;
                    Vector3.Lerp(ref py0, ref py1, tx, out positions[index]);
                    masses[index] = 1;
                }
            }

            var body = new SoftBody(worldInfo, total, positions, masses);

            if ((fixedCorners & 1) != 0)
            {
                body.SetMass(0, 0);
            }
            if ((fixedCorners & 2) != 0)
            {
                body.SetMass(rx - 1, 0);
            }
            if ((fixedCorners & 4) != 0)
            {
                body.SetMass(rx * (ry - 1), 0);
            }
            if ((fixedCorners & 8) != 0)
            {
                body.SetMass(rx * (ry - 1) + rx - 1, 0);
            }

            // Create links and faces
            for (int y = 0; y < ry; ++y)
            {
                for (int x = 0; x < rx; ++x)
                {
                    int ixy  = rx * y + x;
                    int ix1y = ixy + 1;
                    int ixy1 = rx * (y + 1) + x;

                    bool mdx = (x + 1) < rx;
                    bool mdy = (y + 1) < ry;
                    if (mdx)
                    {
                        body.AppendLink(ixy, ix1y);
                    }
                    if (mdy)
                    {
                        body.AppendLink(ixy, ixy1);
                    }
                    if (mdx && mdy)
                    {
                        int ix1y1 = ixy1 + 1;
                        if (((x + y) & 1) != 0)
                        {
                            body.AppendFace(ixy, ix1y, ix1y1);
                            body.AppendFace(ixy, ix1y1, ixy1);
                            if (generateDiagonals)
                            {
                                body.AppendLink(ixy, ix1y1);
                            }
                        }
                        else
                        {
                            body.AppendFace(ixy1, ixy, ix1y);
                            body.AppendFace(ixy1, ix1y, ix1y1);
                            if (generateDiagonals)
                            {
                                body.AppendLink(ix1y, ixy1);
                            }
                        }
                    }
                }
            }

            return(body);
        }
コード例 #6
0
ファイル: BPhysicsWorld.cs プロジェクト: gRally/gStageEditor
        protected void Dispose(bool disposing)
        {
            if (debugType >= BDebug.DebugType.Debug)
            {
                Debug.Log("BDynamicsWorld Disposing physics.");
            }

            /* NU
             * if (lateUpdateHelper != null)
             * {
             *  lateUpdateHelper.m_ddWorld = null;
             *  lateUpdateHelper.m_world = null;
             * }
             */
            if (m_world != null)
            {
                //remove/dispose constraints
                int i;
                if (_ddWorld != null)
                {
                    if (debugType >= BDebug.DebugType.Debug)
                    {
                        Debug.LogFormat("Removing Constraints {0}", _ddWorld.NumConstraints);
                    }
                    for (i = _ddWorld.NumConstraints - 1; i >= 0; i--)
                    {
                        TypedConstraint constraint = _ddWorld.GetConstraint(i);
                        _ddWorld.RemoveConstraint(constraint);
                        if (constraint.Userobject is BTypedConstraint)
                        {
                            ((BTypedConstraint)constraint.Userobject).m_isInWorld = false;
                        }
                        if (debugType >= BDebug.DebugType.Debug)
                        {
                            Debug.LogFormat("Removed Constaint {0}", constraint.Userobject);
                        }
                        constraint.Dispose();
                    }
                }

                /* gRally
                 * if (debugType >= BDebug.DebugType.Debug) Debug.LogFormat("Removing Collision Objects {0}", _ddWorld.NumCollisionObjects);
                 * //remove the rigidbodies from the dynamics world and delete them
                 * for (i = m_world.NumCollisionObjects - 1; i >= 0; i--)
                 * {
                 *  CollisionObject obj = m_world.CollisionObjectArray[i];
                 *  RigidBody body = obj as RigidBody;
                 *  if (body != null && body.MotionState != null)
                 *  {
                 *      Debug.Assert(body.NumConstraintRefs == 0, "Rigid body still had constraints");
                 *      body.MotionState.Dispose();
                 *  }
                 *  m_world.RemoveCollisionObject(obj);
                 *  if (obj.UserObject is BCollisionObject) ((BCollisionObject)obj.UserObject).isInWorld = false;
                 *  if (debugType >= BDebug.DebugType.Debug) Debug.LogFormat("Removed CollisionObject {0}", obj.UserObject);
                 *  obj.Dispose();
                 * }
                 *
                 */

                if (m_world.DebugDrawer != null)
                {
                    if (m_world.DebugDrawer is IDisposable)
                    {
                        IDisposable dis = (IDisposable)m_world.DebugDrawer;
                        dis.Dispose();
                    }
                }

                m_world.Dispose();
                Broadphase.Dispose();
                Dispatcher.Dispose();
                CollisionConf.Dispose();
                _ddWorld = null;
                m_world  = null;
            }

            if (Broadphase != null)
            {
                Broadphase.Dispose();
                Broadphase = null;
            }
            if (Dispatcher != null)
            {
                Dispatcher.Dispose();
                Dispatcher = null;
            }
            if (CollisionConf != null)
            {
                CollisionConf.Dispose();
                CollisionConf = null;
            }
            if (Solver != null)
            {
                Solver.Dispose();
                Solver = null;
            }
            if (softBodyWorldInfo != null)
            {
                softBodyWorldInfo.Dispose();
                softBodyWorldInfo = null;
            }
            _isDisposed = true;
            singleton   = null;
        }
コード例 #7
0
        public static SoftBody CreatePatch(SoftBodyWorldInfo worldInfo, Vector3 corner00,
                                           Vector3 corner10, Vector3 corner01, Vector3 corner11, int resx, int resy,
                                           int fixeds, bool gendiags)
        {
            // Create nodes
            if ((resx < 2) || (resy < 2))
            {
                return(null);
            }

            int rx  = resx;
            int ry  = resy;
            int tot = rx * ry;

            Vector3[] x = new Vector3[tot];
            float[]   m = new float[tot];

            for (int iy = 0; iy < ry; iy++)
            {
                float   ty = iy / (float)(ry - 1);
                Vector3 py0, py1;
                Vector3.Lerp(ref corner00, ref corner01, ty, out py0);
                Vector3.Lerp(ref corner10, ref corner11, ty, out py1);
                for (int ix = 0; ix < rx; ix++)
                {
                    float tx    = ix / (float)(rx - 1);
                    int   index = rx * iy + ix;
                    Vector3.Lerp(ref py0, ref py1, tx, out x[index]);
                    m[index] = 1;
                }
            }

            SoftBody psb = new SoftBody(worldInfo, tot, x, m);

            if ((fixeds & 1) != 0)
            {
                psb.SetMass(0, 0);
            }
            if ((fixeds & 2) != 0)
            {
                psb.SetMass(rx - 1, 0);
            }
            if ((fixeds & 4) != 0)
            {
                psb.SetMass(rx * (ry - 1), 0);
            }
            if ((fixeds & 8) != 0)
            {
                psb.SetMass(rx * (ry - 1) + rx - 1, 0);
            }

            // Create links and faces
            for (int iy = 0; iy < ry; ++iy)
            {
                for (int ix = 0; ix < rx; ++ix)
                {
                    int ixy  = rx * iy + ix;
                    int ix1y = ixy + 1;
                    int ixy1 = rx * (iy + 1) + ix;

                    bool mdx = (ix + 1) < rx;
                    bool mdy = (iy + 1) < ry;
                    if (mdx)
                    {
                        psb.AppendLink(ixy, ix1y);
                    }
                    if (mdy)
                    {
                        psb.AppendLink(ixy, ixy1);
                    }
                    if (mdx && mdy)
                    {
                        int ix1y1 = ixy1 + 1;
                        if (((ix + iy) & 1) != 0)
                        {
                            psb.AppendFace(ixy, ix1y, ix1y1);
                            psb.AppendFace(ixy, ix1y1, ixy1);
                            if (gendiags)
                            {
                                psb.AppendLink(ixy, ix1y1);
                            }
                        }
                        else
                        {
                            psb.AppendFace(ixy1, ixy, ix1y);
                            psb.AppendFace(ixy1, ix1y, ix1y1);
                            if (gendiags)
                            {
                                psb.AppendLink(ix1y, ixy1);
                            }
                        }
                    }
                }
            }

            return(psb);
        }
コード例 #8
0
        protected void Dispose(bool disposing)
        {
            if (debugType >= BDebug.DebugType.Debug)
            {
                Debug.Log("BDynamicsWorld Disposing physics.");
            }

            if (lateUpdateHelper != null)
            {
                lateUpdateHelper.m_ddWorld = null;
                lateUpdateHelper.m_world   = null;
            }
            if (m_world != null)
            {
                int i;
                if (m_world is MultiBodyDynamicsWorld)
                {
                    MultiBodyDynamicsWorld multiBodyWorld = (MultiBodyDynamicsWorld)m_world;
                    if (debugType >= BDebug.DebugType.Debug)
                    {
                        Debug.LogFormat("Removing Multibody Constraints {0}", multiBodyWorld.NumMultiBodyConstraints);
                    }
                    for (i = multiBodyWorld.NumMultiBodyConstraints - 1; i >= 0; i--)
                    {
                        MultiBodyConstraint constraint = multiBodyWorld.GetMultiBodyConstraint(i);
                        multiBodyWorld.RemoveMultiBodyConstraint(constraint);
                        if (debugType >= BDebug.DebugType.Debug)
                        {
                            Debug.LogFormat("Removed Multbody Constaint {0}", constraint);
                        }
                        constraint.Dispose();
                    }
                    if (debugType >= BDebug.DebugType.Debug)
                    {
                        Debug.LogFormat("Removing Multibodies {0}", multiBodyWorld.NumMultibodies);
                    }
                    for (i = multiBodyWorld.NumMultibodies - 1; i >= 0; i--)
                    {
                        MultiBody mb = multiBodyWorld.GetMultiBody(i);
                        multiBodyWorld.RemoveMultiBody(mb);
                        if (debugType >= BDebug.DebugType.Debug)
                        {
                            Debug.LogFormat("Removed Multbody {0}", mb);
                        }
                        //TODO user pointer for the multibody
                        mb.Dispose();
                    }
                }
                //remove/dispose constraints

                if (_ddWorld != null)
                {
                    if (debugType >= BDebug.DebugType.Debug)
                    {
                        Debug.LogFormat("Removing Constraints {0}", _ddWorld.NumConstraints);
                    }
                    for (i = _ddWorld.NumConstraints - 1; i >= 0; i--)
                    {
                        TypedConstraint constraint = _ddWorld.GetConstraint(i);
                        _ddWorld.RemoveConstraint(constraint);
                        if (constraint.Userobject is BTypedConstraint)
                        {
                            ((BTypedConstraint)constraint.Userobject).m_isInWorld = false;
                        }
                        if (debugType >= BDebug.DebugType.Debug)
                        {
                            Debug.LogFormat("Removed Constaint {0}", constraint.Userobject);
                        }
                        constraint.Dispose();
                    }
                }

                //todo multibody

                if (debugType >= BDebug.DebugType.Debug)
                {
                    Debug.LogFormat("Removing Collision Objects {0}", _ddWorld.NumCollisionObjects);
                }
                //remove the rigidbodies from the dynamics world and delete them
                for (i = m_world.NumCollisionObjects - 1; i >= 0; i--)
                {
                    CollisionObject obj  = m_world.CollisionObjectArray[i];
                    RigidBody       body = obj as RigidBody;
                    if (body != null && body.MotionState != null)
                    {
                        Debug.Assert(body.NumConstraintRefs == 0, "Rigid body still had constraints");
                        body.MotionState.Dispose();
                    }
                    m_world.RemoveCollisionObject(obj);
                    if (obj.UserObject is BCollisionObject)
                    {
                        ((BCollisionObject)obj.UserObject).isInWorld = false;
                    }
                    if (debugType >= BDebug.DebugType.Debug)
                    {
                        Debug.LogFormat("Removed CollisionObject {0}", obj.UserObject);
                    }
                    obj.Dispose();
                }

                if (m_world.DebugDrawer != null)
                {
                    if (m_world.DebugDrawer is IDisposable)
                    {
                        IDisposable dis = (IDisposable)m_world.DebugDrawer;
                        dis.Dispose();
                    }
                }

                m_world.Dispose();
                Broadphase.Dispose();
                Dispatcher.Dispose();
                CollisionConf.Dispose();
                _ddWorld = null;
                m_world  = null;
            }

            if (Broadphase != null)
            {
                Broadphase.Dispose();
                Broadphase = null;
            }
            if (Dispatcher != null)
            {
                Dispatcher.Dispose();
                Dispatcher = null;
            }
            if (CollisionConf != null)
            {
                CollisionConf.Dispose();
                CollisionConf = null;
            }
            if (constraintSolver != null)
            {
                constraintSolver.Dispose();
                constraintSolver = null;
            }
            if (softBodyWorldInfo != null)
            {
                softBodyWorldInfo.Dispose();
                softBodyWorldInfo = null;
            }
            _isDisposed = true;
            singleton   = null;
        }
コード例 #9
0
ファイル: BPhysicsWorld.cs プロジェクト: gRally/gStageEditor
        /*
         * 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 SequentialImpulseConstraintSolver solver,
                                       out SoftBodyWorldInfo softBodyWorldInfo)
        {
            bool success = true;

            /* gRally
             * 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;
            broadphase      = null; // gRally new AxisSweep3(m_axis3SweepBroadphaseMin.ToBullet(), m_axis3SweepBroadphaseMax.ToBullet(), axis3SweepMaxProxies); // gRally

            /* gRally
             * 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;

            /* gRally
             * if (m_worldType == WorldType.CollisionOnly)
             * {
             *  world = new CollisionWorld(dispatcher, broadphase, collisionConfig);
             * }
             * else if (m_worldType == WorldType.RigidBodyDynamics)
             * {
             *  world = new DiscreteDynamicsWorld(dispatcher, broadphase, null, collisionConfig);
             * }
             * else if (m_worldType == WorldType.MultiBodyWorld)
             * {
             *  world = new MultiBodyDynamicsWorld(dispatcher, broadphase, null, collisionConfig);
             * }
             * else if (m_worldType == WorldType.SoftBodyAndRigidBody)
             * {
             *  Solver = new SequentialImpulseConstraintSolver();
             *  Solver.RandSeed = sequentialImpulseConstraintSolverRandomSeed;
             *  m_world = new SoftRigidDynamicsWorld(Dispatcher, Broadphase, Solver, 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();
             * }
             */

            // gRally stuff!
            collisionConfig = new DefaultCollisionConfiguration();
            dispatcher      = new CollisionDispatcher(collisionConfig);
            // #gStageEditor broadphase = new AxisSweep3(GRSimData.PairCache);
            // #gStageEditor world = new DiscreteDynamicsWorld(GRSimData.BulletWorld, dispatcher, broadphase);

            // UP!_ddWorld = (DiscreteDynamicsWorld)m_world;

            if (world is DiscreteDynamicsWorld)
            {
                // gRally .. ((DiscreteDynamicsWorld)world).Gravity = m_gravity.ToBullet();
            }
            if (_doDebugDraw)
            {
                DebugDrawUnity db = new DebugDrawUnity();
                db.DebugMode      = _debugDrawMode;
                world.DebugDrawer = db;
            }
            return(success);
        }
コード例 #10
0
        protected virtual void _InitializePhysicsWorld()
        {
            _isDisposed = false;
            if (m_worldType == WorldType.SoftBodyAndRigidBody && m_collisionType == CollisionConfType.DefaultDynamicsWorldCollisionConf)
            {
                BDebug.LogError(debugType, "For World Type = SoftBodyAndRigidBody collisionType must be collisionType=SoftBodyRigidBodyCollisionConf. Switching");
                m_collisionType = CollisionConfType.SoftBodyRigidBodyCollisionConf;
            }

            if (m_collisionType == CollisionConfType.DefaultDynamicsWorldCollisionConf)
            {
                CollisionConf = new DefaultCollisionConfiguration();
            }
            else if (m_collisionType == CollisionConfType.SoftBodyRigidBodyCollisionConf)
            {
                CollisionConf = new SoftBodyRigidBodyCollisionConfiguration();
            }

            Dispatcher = new CollisionDispatcher(CollisionConf);

            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;
            }

            if (m_worldType == WorldType.CollisionOnly)
            {
                m_world  = new CollisionWorld(Dispatcher, Broadphase, CollisionConf);
                _ddWorld = null;
            }
            else if (m_worldType == WorldType.RigidBodyDynamics)
            {
                m_world  = new DiscreteDynamicsWorld(Dispatcher, Broadphase, null, CollisionConf);
                _ddWorld = (DiscreteDynamicsWorld)m_world;
            }
            else if (m_worldType == WorldType.MultiBodyWorld)
            {
                m_world  = new MultiBodyDynamicsWorld(Dispatcher, Broadphase, null, CollisionConf);
                _ddWorld = (DiscreteDynamicsWorld)m_world;
            }
            else if (m_worldType == WorldType.SoftBodyAndRigidBody)
            {
                Solver            = new SequentialImpulseConstraintSolver();
                Solver.RandSeed   = sequentialImpulseConstraintSolverRandomSeed;
                softBodyWorldInfo = new SoftBodyWorldInfo
                {
                    AirDensity   = 1.2f,
                    WaterDensity = 0,
                    WaterOffset  = 0,
                    WaterNormal  = BulletSharp.Math.Vector3.Zero,
                    Gravity      = UnityEngine.Physics.gravity.ToBullet(),
                    Dispatcher   = Dispatcher,
                    Broadphase   = Broadphase
                };
                softBodyWorldInfo.SparseSdf.Initialize();

                m_world  = new SoftRigidDynamicsWorld(Dispatcher, Broadphase, Solver, CollisionConf);
                _ddWorld = (DiscreteDynamicsWorld)m_world;

                m_world.DispatchInfo.EnableSpu = true;
                softBodyWorldInfo.SparseSdf.Reset();
                softBodyWorldInfo.AirDensity   = 1.2f;
                softBodyWorldInfo.WaterDensity = 0;
                softBodyWorldInfo.WaterOffset  = 0;
                softBodyWorldInfo.WaterNormal  = BulletSharp.Math.Vector3.Zero;
                softBodyWorldInfo.Gravity      = m_gravity.ToBullet();
            }
            if (_ddWorld != null)
            {
                _ddWorld.Gravity = m_gravity.ToBullet();
            }
            if (_doDebugDraw)
            {
                DebugDrawUnity db = new DebugDrawUnity();
                db.DebugMode        = _debugDrawMode;
                m_world.DebugDrawer = db;
            }
        }
コード例 #11
0
 public void SetUp()
 {
     _softBodyWorldInfo = new SoftBodyWorldInfo();
 }
コード例 #12
0
        protected void Dispose(bool disposing)
        {
            BDebug.Log(debugType, "BDynamicsWorld Disposing physics.");

            if (m_world != null)
            {
                //remove/dispose constraints
                int i;
                if (_ddWorld != null)
                {
                    for (i = _ddWorld.NumConstraints - 1; i >= 0; i--)
                    {
                        TypedConstraint constraint = _ddWorld.GetConstraint(i);
                        _ddWorld.RemoveConstraint(constraint);
                        if (constraint.Userobject is BTypedConstraint)
                        {
                            ((BTypedConstraint)constraint.Userobject).isInWorld = false;
                        }
                        if ((debugType & BDebug.DebugType.Debug) == BDebug.DebugType.Debug)
                        {
                            Debug.LogFormat("Removed Constaint {0}", constraint.Userobject);
                        }
                        constraint.Dispose();
                    }
                }

                //remove the rigidbodies from the dynamics world and delete them
                for (i = m_world.NumCollisionObjects - 1; i >= 0; i--)
                {
                    CollisionObject obj  = m_world.CollisionObjectArray[i];
                    RigidBody       body = obj as RigidBody;
                    if (body != null && body.MotionState != null)
                    {
                        body.MotionState.Dispose();
                    }
                    m_world.RemoveCollisionObject(obj);
                    if (obj.UserObject is BCollisionObject)
                    {
                        ((BCollisionObject)obj.UserObject).isInWorld = false;
                    }
                    if ((debugType & BDebug.DebugType.Debug) == BDebug.DebugType.Debug)
                    {
                        Debug.LogFormat("Removed CollisionObject {0}", obj.UserObject);
                    }
                    obj.Dispose();
                }

                if (m_world.DebugDrawer != null)
                {
                    if (m_world.DebugDrawer is IDisposable)
                    {
                        IDisposable dis = (IDisposable)m_world.DebugDrawer;
                        dis.Dispose();
                    }
                }

                m_world.Dispose();
                Broadphase.Dispose();
                Dispatcher.Dispose();
                CollisionConf.Dispose();
                _ddWorld = null;
                m_world  = null;
            }

            if (Broadphase != null)
            {
                Broadphase.Dispose();
                Broadphase = null;
            }
            if (Dispatcher != null)
            {
                Dispatcher.Dispose();
                Dispatcher = null;
            }
            if (CollisionConf != null)
            {
                CollisionConf.Dispose();
                CollisionConf = null;
            }
            if (Solver != null)
            {
                Solver.Dispose();
                Solver = null;
            }
            if (softBodyWorldInfo != null)
            {
                softBodyWorldInfo.Dispose();
                softBodyWorldInfo = null;
            }
            _isDisposed = true;
            singleton   = null;
        }
コード例 #13
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();
        }
    }
コード例 #14
0
ファイル: BPhysicsWorld.cs プロジェクト: yzx4036/BodyET
        protected void Dispose(bool disposing)
        {
            if (lateUpdateHelper != null)
            {
                lateUpdateHelper.m_ddWorld = null;
                lateUpdateHelper.m_world   = null;
            }
            if (m_world != null)
            {
                //remove/dispose constraints
                int i;
                if (_ddWorld != null)
                {
                    for (i = _ddWorld.NumConstraints - 1; i >= 0; i--)
                    {
                        TypedConstraint constraint = _ddWorld.GetConstraint(i);
                        _ddWorld.RemoveConstraint(constraint);
                        if (constraint.Userobject is BTypedConstraint)
                        {
                            ((BTypedConstraint)constraint.Userobject).m_isInWorld = false;
                        }
                        constraint.Dispose();
                    }
                }

                //remove the rigidbodies from the dynamics world and delete them
                for (i = m_world.NumCollisionObjects - 1; i >= 0; i--)
                {
                    CollisionObject obj  = m_world.CollisionObjectArray[i];
                    RigidBody       body = obj as RigidBody;
                    if (body != null && body.MotionState != null)
                    {
                        Debug.Assert(body.NumConstraintRefs == 0, "Rigid body still had constraints");
                        body.MotionState.Dispose();
                    }
                    m_world.RemoveCollisionObject(obj);
                    if (obj.UserObject is BCollisionObject)
                    {
                        ((BCollisionObject)obj.UserObject).isInWorld = false;
                    }
                    obj.Dispose();
                }

                if (m_world.DebugDrawer != null)
                {
                    if (m_world.DebugDrawer is IDisposable)
                    {
                        IDisposable dis = (IDisposable)m_world.DebugDrawer;
                        dis.Dispose();
                    }
                }

                m_world.Dispose();
                Broadphase.Dispose();
                Dispatcher.Dispose();
                CollisionConf.Dispose();
                _ddWorld = null;
                m_world  = null;
            }

            if (Broadphase != null)
            {
                Broadphase.Dispose();
                Broadphase = null;
            }
            if (Dispatcher != null)
            {
                Dispatcher.Dispose();
                Dispatcher = null;
            }
            if (CollisionConf != null)
            {
                CollisionConf.Dispose();
                CollisionConf = null;
            }
            if (constraintSolver != null)
            {
                constraintSolver.Dispose();
                constraintSolver = null;
            }
            if (softBodyWorldInfo != null)
            {
                softBodyWorldInfo.Dispose();
                softBodyWorldInfo = null;
            }
            _isDisposed = true;
            singleton   = null;
        }
コード例 #15
0
        public static SoftBody CreateFromVtkFile(SoftBodyWorldInfo worldInfo, string fileName)
        {
            List <Vector3> points = new List <Vector3>(0);
            List <int[]>   cells  = new List <int[]>(0);

            using (var reader = new StreamReader(fileName))
            {
                bool   readingPoints = false;
                bool   readingCells  = false;
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    if (line.Length == 0)
                    {
                        continue;
                    }

                    string[] lineParts = line.Split(' ');
                    if (lineParts[0] == "POINTS")
                    {
                        readingPoints   = true;
                        readingCells    = false;
                        points.Capacity = int.Parse(lineParts[1]);
                    }
                    else if (lineParts[0] == "CELLS")
                    {
                        readingPoints  = false;
                        readingCells   = true;
                        cells.Capacity = int.Parse(lineParts[1]);
                    }
                    else if (lineParts[0] == "CELL_TYPES")
                    {
                        readingPoints = false;
                        readingCells  = false;
                    }
                    else if (readingPoints)
                    {
                        Vector3 point = new Vector3(
                            (float)ParseDouble(lineParts[0]),
                            (float)ParseDouble(lineParts[1]),
                            (float)ParseDouble(lineParts[2]));
                        points.Add(point);
                    }
                    else if (readingCells)
                    {
                        int   numPoints = int.Parse(lineParts[0]);
                        int[] cell      = new int[numPoints];
                        for (int i = 0; i < numPoints; i++)
                        {
                            cell[i] = int.Parse(lineParts[i + 1]);
                        }
                        cells.Add(cell);
                    }
                }
            }
            SoftBody body = new SoftBody(worldInfo, points.Count, points.ToArray(), null);

            foreach (int[] cell in cells)
            {
                body.AppendTetra(cell[0], cell[1], cell[2], cell[3]);
                body.AppendLink(cell[0], cell[1], null, true);
                body.AppendLink(cell[1], cell[2], null, true);
                body.AppendLink(cell[2], cell[0], null, true);
                body.AppendLink(cell[0], cell[3], null, true);
                body.AppendLink(cell[1], cell[3], null, true);
                body.AppendLink(cell[2], cell[3], null, true);
            }

            GenerateBoundaryFaces(body);
            body.InitializeDmInverse();
            body.TetraScratches.Resize(body.Tetras.Count);
            body.TetraScratchesTn.Resize(body.Tetras.Count);
            //Console.WriteLine($"Nodes:  {body.Nodes.Count}");
            //Console.WriteLine($"Links:  {body.Links.Count}");
            //Console.WriteLine($"Faces:  {body.Faces.Count}");
            //Console.WriteLine($"Tetras: {body.Tetras.Count}");

            return(body);
        }
コード例 #16
0
        SoftBody CreateVolumetricSoftbody(SoftBodyWorldInfo worldInfo, BulletSharp.Math.Vector3[] vertices)
        {
            int vertexcount = vertices.Length;

            psb = new SoftBody(worldInfo, vertexcount, vertices, null);

            for (int x = 3; vertexcount > x; x += 4)
            {
                int n0 = x - 3;
                int n1 = x - 2;
                int n2 = x - 1;
                int n3 = x - 0;
                psb.AppendTetra(n0, n1, n2, n3);

                psb.AppendLink(n0, n1);
                linkdata.Add(true);
                brokenlinks.Add(false);

                psb.AppendLink(n1, n2);
                linkdata.Add(true);
                brokenlinks.Add(false);

                psb.AppendLink(n2, n0);
                linkdata.Add(true);
                brokenlinks.Add(false);

                psb.AppendLink(n0, n3);
                linkdata.Add(true);
                brokenlinks.Add(false);

                psb.AppendLink(n1, n3);
                linkdata.Add(true);
                brokenlinks.Add(false);

                psb.AppendLink(n2, n3);
                linkdata.Add(true);
                brokenlinks.Add(false);

                ValidTetras.Add(true);
            }

            instances = GetInstances(vertices);
            //List<bool> ValidCuts = CutTest3(vertices);
            for (int x = 0; instances.Count > x; x++)
            {
                //if (ValidCuts[x] == false)
                {
                    //    continue;
                }
                for (int i = 1; instances[x].Count > i; i++)
                {
                    int i1 = instances[x][i - 1];
                    int i2 = instances[x][i - 0];
                    psb.AppendLink(i1, i2);
                    linkdata.Add(false);
                    brokenlinks.Add(false);
                }
            }

            return(psb);
        }