Пример #1
0
        public Actor(byte worldId)
        {
            WorldId = worldId;

            //mMaxRotationSpeed = 5.0f;
            mMaxLinearSpeed  = 60.0f;
            mVelocity        = Vector3.zero;
            mWallRestitution = 0.1f;

            mActorRestitution = 0.1f;

            mThrustDir = 0.0f;

            mPlayerId = 0;

            mIsShooting = false;
            mIsBomb     = false;

            mHealth = 10;
            SetCollisionRadius(0.45f);

            CacheAttributes();


#if _USE_BEPU_PHYSICS
            mCharacterController = new BEPUphysics.Character.CharacterController(new BEPUutilities.Vector3(0, 3, 0), 1.0f, 1.0f * 0.7f, 1.0f * 0.3f, 0.5f, 0.001f, 10f, 0.8f, 1.3f, 8.0f
                                                                                 , 3f, 1.5f, 1000, 0f, 0f, 0f, 0f
                                                                                 );

            World.Instance(worldId).space.Add(mCharacterController);
#endif
        }
Пример #2
0
        public void SetPhysics()
        {
            LogHelper.LogInfo("character physics setting");

#if _USE_BEPU_PHYSICS
            mCharacterController = new BEPUphysics.Character.CharacterController(new BEPUutilities.Vector3(GetLocation().x, GetLocation().y, GetLocation().z), 1.0f, 1.0f * 0.7f, 1.0f * 0.3f, 0.5f, 0.001f, 10f, 0.8f, 1.3f
                                                                                 , 5.0f // standing speed
                                                                                 , 3f, 1.5f, 1000, 0f, 0f, 0f, 0f
                                                                                 );

            World.Instance(WorldId).space.Add(mCharacterController);
#elif _USE_BULLET_SHARP
            /*
             * m_collisionShape = new BulletSharp.CapsuleShape(0.5f, 0.5f);
             *
             * m_collisionObject = new BulletSharp.PairCachingGhostObject();
             * m_collisionObject.CollisionShape = m_collisionShape;
             * m_collisionObject.CollisionFlags = BulletSharp.CollisionFlags.CharacterObject;
             * mCharacterController = new BulletSharp.KinematicCharacterController(m_collisionObject, (BulletSharp.ConvexShape)m_collisionShape, 0.01f);
             *
             *
             * BulletSharp.Math.Matrix worldTrans = new BulletSharp.Math.Matrix();
             * worldTrans.M41 = 7f;
             * worldTrans.M42 = 10f;
             * worldTrans.M43 = 0;
             * m_collisionObject.WorldTransform = worldTrans;
             * m_collisionObject.UserObject = this;
             *
             * World.Instance(worldId).world.AddCollisionObject(m_collisionObject, BulletSharp.CollisionFilterGroups.DefaultFilter, BulletSharp.CollisionFilterGroups.Everything);
             * World.Instance(worldId).world.AddAction(mCharacterController);
             */


            //m_collisionObject = new BulletSharp.RigidBody(new BulletSharp.RigidBodyConstructionInfo(1f, new BulletSharp.DefaultMotionState(), new BulletSharp.CapsuleShape(0.5f, 0.5f), new BulletSharp.Math.Vector3(0, 1f, 0)));
            //m_collisionObject.CollisionFlags = BulletSharp.CollisionFlags.StaticObject;

            //BulletSharp.Math.Matrix worldTrans = new BulletSharp.Math.Matrix();
            //worldTrans.M41 = 0f;
            //worldTrans.M42 =1f;
            //worldTrans.M43 = 0;
            //m_collisionObject.WorldTransform = worldTrans;


            //World.Instance(worldId).world.AddRigidBody((BulletSharp.RigidBody)m_collisionObject, BulletSharp.CollisionFilterGroups.DefaultFilter, BulletSharp.CollisionFilterGroups.Everything);



            ghostObject = new BulletSharp.PairCachingGhostObject();
            ghostObject.WorldTransform = BulletSharp.Math.Matrix.Translation(7f, 10f, 0f);
            World.Instance(worldId).Broadphase.OverlappingPairCache.SetInternalGhostPairCallback(new BulletSharp.GhostPairCallback());

            const float characterHeight = 0.5f;
            const float characterWidth  = 0.5f;
            var         capsule         = new BulletSharp.CapsuleShape(characterWidth, characterHeight);
            //capsule.Margin = 0f;
            ghostObject.CollisionShape = capsule;
            ghostObject.CollisionFlags = BulletSharp.CollisionFlags.CharacterObject;

            const float stepHeight      = 0.35f;
            BulletSharp.Math.Vector3 up = new BulletSharp.Math.Vector3(Vector3.up.x, Vector3.up.y, Vector3.up.z);
            character = new BulletSharp.KinematicCharacterController(ghostObject, capsule, stepHeight, ref up);



            World.Instance(worldId).world.AddCollisionObject(ghostObject, BulletSharp.CollisionFilterGroups.CharacterFilter, BulletSharp.CollisionFilterGroups.StaticFilter | BulletSharp.CollisionFilterGroups.DefaultFilter);

            World.Instance(worldId).world.AddAction(character);
#elif _USE_BEPU_PHYSICS_V2
            var   initialPosition   = new System.Numerics.Vector3(7f, 10f, 0f);
            float speculativeMargin = 0.1f;
            float mass = 1;
            float maximumHorizontalForce   = 20;
            float maximumVerticalGlueForce = 100;
            float jumpVelocity             = 6;
            //float speed = 4;
            float maximumSlope = (float)Math.PI * 0.4f;

            var shape = new Capsule(0.5f, 1);

            var shapeIndex = World.Instance(worldId).characters.Simulation.Shapes.Add(shape);

            var bodyHandle = World.Instance(worldId).characters.Simulation.Bodies.Add(BodyDescription.CreateDynamic(initialPosition, new BodyInertia {
                InverseMass = 1f / mass
            }, new CollidableDescription(shapeIndex, speculativeMargin), new BodyActivityDescription(shape.Radius * 0.02f)));
            character                                 = World.Instance(worldId).characters.AllocateCharacter(bodyHandle);
            character.LocalUp                         = new System.Numerics.Vector3(0, 1, 0);
            character.CosMaximumSlope                 = (float)Math.Cos(maximumSlope);
            character.JumpVelocity                    = jumpVelocity;
            character.MaximumVerticalForce            = maximumVerticalGlueForce;
            character.MaximumHorizontalForce          = maximumHorizontalForce;
            character.MinimumSupportDepth             = shape.Radius * -0.01f;
            character.MinimumSupportContinuationDepth = -speculativeMargin;

            body = World.Instance(worldId).characters.Simulation.Bodies.GetBodyReference(bodyHandle);
#endif
        }