コード例 #1
0
        //called by Physics World just before rigid body is added to world.
        //the current rigid body properties are used to rebuild the rigid body.
        internal override bool _BuildCollisionObject()
        {
            BPhysicsWorld world = BPhysicsWorld.Get;

            if (m_collisionObject != null)
            {
                if (isInWorld && world != null)
                {
                    isInWorld = false;
                    world.RemoveCollisionObject(this);
                }
            }
            m_collisionShape = this.GetParent <Unit>().GetComponent <BCollisionShape>().baseBCollisionShape;//这里将不能用mono的方式获取,就直接赋值了!
            if (m_collisionShape == null)
            {
                Log.Warning("There was no collision shape component attached to this BRigidBody. ");
                return(false);
            }
            if (!(m_collisionShape is BConvexHullShape))//这里是直接参考了BTerrainCollisionObject
            {
                Log.Warning("The collision shape needs to be a BHeightfieldTerrainShape. ");
                return(false);
            }

            CollisionShape cs = this.GetParent <Unit>().GetComponent <BCollisionShape>().GetCollisionShape;

            //rigidbody is dynamic if and only if mass is non zero, otherwise static

            if (m_collisionObject == null)
            {
                m_collisionObject = new CollisionObject();
                m_collisionObject.CollisionShape = cs;
                m_collisionObject.UserObject     = this;

                BulletSharp.Math.Matrix worldTrans = BulletSharp.Math.Matrix.Identity;
                // Vector3 pos = this.GetParent<Unit>().Position + new Vector3(td.size.x * .5f, td.size.y * .5f, td.size.z * .5f);
                Vector3 pos = this.GetParent <Unit>().Position;
                worldTrans.Origin = pos.ToBullet();
                m_collisionObject.WorldTransform = worldTrans;
                m_collisionObject.CollisionFlags = m_collisionFlags;
            }
            else
            {
                m_collisionObject.CollisionShape = cs;
                BulletSharp.Math.Matrix worldTrans = BulletSharp.Math.Matrix.Identity;
                // Vector3 pos = this.GetParent<Unit>().Position + new Vector3(td.size.x * .5f, td.size.y * .5f, td.size.z * .5f);
                Vector3 pos = this.GetParent <Unit>().Position;
                worldTrans.Origin = pos.ToBullet();
                m_collisionObject.WorldTransform = worldTrans;
                m_collisionObject.CollisionFlags = m_collisionFlags;
            }
            return(true);
        }
コード例 #2
0
ファイル: BCollisionObject.cs プロジェクト: yzx4036/BodyET
 protected virtual void Dispose(bool isdisposing)
 {
     if (isInWorld && isdisposing && m_collisionObject != null)
     {
         BPhysicsWorld pw = BPhysicsWorld.Get;
         if (pw != null && pw.world != null)
         {
             ((DiscreteDynamicsWorld)pw.world).RemoveCollisionObject(m_collisionObject);
         }
     }
     if (m_collisionObject != null)
     {
         m_collisionObject.Dispose();
         m_collisionObject = null;
     }
 }
コード例 #3
0
ファイル: BGhostObject.cs プロジェクト: yzx4036/BodyET
        internal override bool _BuildCollisionObject()
        {
            BPhysicsWorld world = BPhysicsWorld.Get;

            if (m_collisionObject != null)
            {
                if (isInWorld && world != null)
                {
                    world.RemoveCollisionObject(this);
                }
            }
            m_collisionShape = this.GetParent <Unit>().GetComponent <BCollisionShape>();
            if (m_collisionShape == null)
            {
                Log.Warning("There was no collision shape component attached to this BRigidBody. ");
                return(false);
            }

            CollisionShape cs = m_collisionShape.GetCollisionShape;

            //rigidbody is dynamic if and only if mass is non zero, otherwise static


            if (m_collisionObject == null)
            {
                m_collisionObject = new BulletSharp.GhostObject();
                m_collisionObject.CollisionShape = cs;
                BulletSharp.Math.Matrix     worldTrans;
                BulletSharp.Math.Quaternion q = this.GetParent <Unit>().Quaternion.ToBullet();
                BulletSharp.Math.Matrix.RotationQuaternion(ref q, out worldTrans);
                worldTrans.Origin = this.GetParent <Unit>().Position.ToBullet();
                m_collisionObject.WorldTransform = worldTrans;
                m_collisionObject.UserObject     = this;
                m_collisionObject.CollisionFlags = m_collisionObject.CollisionFlags | BulletSharp.CollisionFlags.NoContactResponse;
            }
            else
            {
                BulletSharp.Math.Matrix     worldTrans;
                BulletSharp.Math.Quaternion q = this.GetParent <Unit>().Quaternion.ToBullet();
                BulletSharp.Math.Matrix.RotationQuaternion(ref q, out worldTrans);
                worldTrans.Origin = this.GetParent <Unit>().Position.ToBullet();
                m_collisionObject.WorldTransform = worldTrans;
                m_collisionObject.CollisionShape = cs;
                m_collisionObject.CollisionFlags = m_collisionObject.CollisionFlags | BulletSharp.CollisionFlags.NoContactResponse;
            }
            return(true);
        }
コード例 #4
0
ファイル: EtRaycast.cs プロジェクト: yzx4036/BodyET
        public void Update()
        {
            setrefresh++;
            if (setrefresh % 10 == 0)
            {
                BulletSharp.Math.Vector3 fromP    = this.GetParent <Unit>().Position.ToBullet();
                BulletSharp.Math.Vector3 toP      = (this.GetParent <Unit>().Position + Vector3.down * 10f).ToBullet();
                ClosestRayResultCallback callback = new ClosestRayResultCallback(ref fromP, ref toP);
                BPhysicsWorld            world    = BPhysicsWorld.Get;
                world.world.RayTest(fromP, toP, callback);
                if (callback.HasHit && callback.CollisionObject.UserObject is Unit unit)
                {
                    Log.Debug("fromp=" + fromP + "||top=" + toP);
                    Log.Debug("Hit p" + callback.HitPointWorld + "N=" + callback.HitNormalWorld + "obj=" + callback.CollisionObject.UserObject);
                    Unit x = unit;
                }

                if (setrefresh > 10000)
                {
                    setrefresh = 0;
                }
            }
        }
コード例 #5
0
        //called by Physics World just before rigid body is added to world.
        //the current rigid body properties are used to rebuild the rigid body.
        internal override bool _BuildCollisionObject()
        {
            // if (td == null)
            // {
            //     Log.Warning("Must be attached to an object with a terrain ");
            //     return false;
            // }
            BPhysicsWorld world = BPhysicsWorld.Get;

            if (m_collisionObject != null)
            {
                if (isInWorld && world != null)
                {
                    isInWorld = false;
                    world.RemoveCollisionObject(this);
                }
            }

            // if (transform.localScale != UnityEngine.Vector3.one)
            // {
            //     Log.Warning("The local scale on this collision shape is not one. Bullet physics does not support scaling on a rigid body world transform. Instead alter the dimensions of the CollisionShape.");
            // }

            m_collisionShape = this.GetParent <Unit>().GetComponent <BCollisionShape>();//这里将不能用mono的方式获取,就直接赋值了!
            if (m_collisionShape == null)
            {
                Log.Warning("There was no collision shape component attached to this BRigidBody. ");
                return(false);
            }
            // if (!(m_collisionShape is BHeightfieldTerrainShape))
            // {
            //     Log.Warning("The collision shape needs to be a BHeightfieldTerrainShape. ");
            //     return false;
            // }

            CollisionShape cs = m_collisionShape.GetCollisionShape;

            //rigidbody is dynamic if and only if mass is non zero, otherwise static

            if (m_collisionObject == null)
            {
                m_collisionObject = new CollisionObject();
                m_collisionObject.CollisionShape = cs;
                m_collisionObject.UserObject     = this;

                BulletSharp.Math.Matrix worldTrans = BulletSharp.Math.Matrix.Identity;
                // Vector3 pos = this.GetParent<Unit>().Position + new Vector3(td.size.x * .5f, td.size.y * .5f, td.size.z * .5f);
                Vector3 pos = this.GetParent <Unit>().Position;
                worldTrans.Origin = pos.ToBullet();
                m_collisionObject.WorldTransform = worldTrans;
                m_collisionObject.CollisionFlags = m_collisionFlags;
            }
            else
            {
                m_collisionObject.CollisionShape = cs;
                BulletSharp.Math.Matrix worldTrans = BulletSharp.Math.Matrix.Identity;
                // Vector3 pos = this.GetParent<Unit>().Position + new Vector3(td.size.x * .5f, td.size.y * .5f, td.size.z * .5f);
                Vector3 pos = this.GetParent <Unit>().Position;
                worldTrans.Origin = pos.ToBullet();
                m_collisionObject.WorldTransform = worldTrans;
                m_collisionObject.CollisionFlags = m_collisionFlags;
            }
            return(true);
        }
コード例 #6
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;
        }
コード例 #7
0
        internal override bool _BuildCollisionObject()
        {
            BPhysicsWorld world = BPhysicsWorld.Get;

            if (m_collisionObject != null)
            {
                if (isInWorld && world != null)
                {
                    isInWorld = false;
                    world.RemoveCollisionObject(this);
                }
            }

            // if (transform.localScale != UnityEngine.Vector3.one)
            // {
            //     Log.Error("The local scale on this collision shape is not one. Bullet physics does not support scaling on a rigid body world transform. Instead alter the dimensions of the CollisionShape.");
            // }

            m_collisionShape = this.GetParent <Unit>().GetComponent <BCollisionShape>();
            if (m_collisionShape == null)
            {
                Log.Error("There was no collision shape component attached to this BRigidBody. ");
                return(false);
            }
            if (!(m_collisionShape.GetCollisionShape is ConvexShape))
            {
                Log.Error("The CollisionShape on this BCharacterController was not a convex shape. ");
                return(false);
            }

            if (m_collisionObject == null)
            {
                m_collisionObject = new PairCachingGhostObject();
                m_collisionObject.CollisionShape = m_collisionShape.GetCollisionShape;
                m_collisionObject.CollisionFlags = m_collisionFlags;
                m_characterController            = new KinematicCharacterController((PairCachingGhostObject)m_collisionObject, (ConvexShape)m_collisionShape.GetCollisionShape, stepHeight, upAxis);
                BulletSharp.Math.Matrix     worldTrans;
                BulletSharp.Math.Quaternion q = this.GetParent <Unit>().Quaternion.ToBullet();
                BulletSharp.Math.Matrix.RotationQuaternion(ref q, out worldTrans);
                worldTrans.Origin = this.GetParent <Unit>().Position.ToBullet();
                m_collisionObject.WorldTransform = worldTrans;
                m_collisionObject.UserObject     = this;
                //world.world.AddCollisionObject(m_collisionObject, CollisionFilterGroups.CharacterFilter, CollisionFilterGroups.StaticFilter | CollisionFilterGroups.DefaultFilter);
                //((DynamicsWorld)world.world).AddAction(m_characterController);
            }
            else
            {
                m_collisionObject.CollisionShape = m_collisionShape.GetCollisionShape;
                m_collisionObject.CollisionFlags = m_collisionFlags;
                if (m_characterController != null)
                {
                    world.RemoveAction(m_characterController);
                }
                m_characterController = new KinematicCharacterController((PairCachingGhostObject)m_collisionObject, (ConvexShape)m_collisionShape.GetCollisionShape, stepHeight, upAxis);
                BulletSharp.Math.Matrix     worldTrans;
                BulletSharp.Math.Quaternion q = this.GetParent <Unit>().Quaternion.ToBullet();
                BulletSharp.Math.Matrix.RotationQuaternion(ref q, out worldTrans);
                worldTrans.Origin = this.GetParent <Unit>().Position.ToBullet();
                m_collisionObject.WorldTransform = worldTrans;
                m_collisionObject.UserObject     = this;
            }
            return(true);
        }