Beispiel #1
0
        private static CompoundShape create_shapes(RepeatedField <Collider> colliders)
        {
            if (colliders == null || colliders.Count == 0)
            {
                throw new Exception("Colliders is null or count is zero");
            }

            var shape_buffer = new List <TransformedShape>();

            foreach (var collider in colliders)
            {
                Shape      shape = null;
                Vector3    center;
                Quaternion rotation;

                switch (collider.ShapeCase)
                {
                case Collider.ShapeOneofCase.None:
                    throw new Exception("Collider without any shape");

                case Collider.ShapeOneofCase.Box:
                    var box = collider.Box;
                    shape    = new Jitter.Collision.Shapes.BoxShape(box.Length, box.Height, box.Width);
                    center   = box.Center;
                    rotation = box.Rotation;
                    break;

                case Collider.ShapeOneofCase.Sphere:
                    var sphere = collider.Sphere;
                    shape    = new Jitter.Collision.Shapes.SphereShape(sphere.Radius);
                    center   = sphere.Center;
                    rotation = sphere.Rotation;
                    break;

                case Collider.ShapeOneofCase.Capsule:
                    var capsule = collider.Capsule;
                    shape    = new Jitter.Collision.Shapes.CapsuleShape(capsule.Height, capsule.Radius);
                    center   = capsule.Center;
                    rotation = capsule.Rotation;
                    break;

                default:
                    Debug.Assert(false, "Unhandled enum value " + collider.ShapeCase);
                    throw new Exception();
                }

                var center_j          = to_j(center);
                var rotation_j        = to_j(rotation);
                var transformed_shape = new TransformedShape(shape, JMatrix.Identity, center_j);
                shape_buffer.Add(transformed_shape);

                if (collider.Children != null && collider.Children.Count > 0)
                {
                    create_shapes(collider.Children);
                }
            }

            return(new CompoundShape(shape_buffer));
        }
        protected virtual RigidBody GeneratePhysicsDescription()
        {
            BoundingSphere bounds = model.CalculateBounds(WorldMatrix);
            Shape collisionShape = new SphereShape(bounds.Radius);
            var rigidBody = new RigidBody(collisionShape)
            {
                Position = PhysicsSystem.toJVector(Position),
                Orientation = PhysicsSystem.toJMatrix(OrientationMatrix),
                IsStatic = false,
                EnableDebugDraw = true,
                Tag = this,
            };

            return rigidBody;
        }
Beispiel #3
0
        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            if (content == null)
                content = new ContentManager(this.Services, "Content");

            /*
            player = new Player();

            world.AddBody(player.body);
            */

            // ball
            JVector position = new JVector(0f, 5f, -10f);
            Shape sphereShape = new SphereShape(1.0f);
            ball = new RigidBody(sphereShape);
            ball.Position = position;
            ball.Material.Restitution = 2.0f;
            ball.Mass = 10f;
            ball.IsStatic = true;

            // floor
            Shape boxShape = new BoxShape(new JVector(20f, 1.5f, 40f));
            floor = new RigidBody(boxShape);
            floor.Position = JVector.Zero;
            floor.IsStatic = true;

            // paddles
            Shape box = new BoxShape(new JVector(5f, 5f, 0.5f));
            paddle1 = new RigidBody(box);
            paddle2 = new RigidBody(box);
            paddle1.Position = JVector.Zero - new JVector(0f,0f,20f);
            paddle2.Position = JVector.Zero + new JVector(0f, 0f, 20f);
            paddle1.IsStatic = true;
            paddle2.IsStatic = true;

            world.AddBody(paddle1);
            world.AddBody(paddle2);
            world.AddBody(ball);
            world.AddBody(floor);
        }
        public override void Build()
        {
            this.Demo.World.Solver = Jitter.World.SolverType.Sequential;

            AddGround();

            RigidBody boxb = new RigidBody(new BoxShape(7,1,2));
            boxb.Position = new JVector(3.0f,12,0);
            this.Demo.World.AddBody(boxb);
            boxb.Tag = BodyTag.DontDrawMe;

            boxb.IsStatic = true;

            this.Demo.World.Solver = Jitter.World.SolverType.Sequential;
            //this.Demo.World.SetDampingFactors(1.0f, 1.0f);

            SphereShape shape = new SphereShape(0.501f);

            for (int i = 0; i < 7; i++)
            {
                RigidBody body = new RigidBody(shape);
                body.Position = new JVector(i, 6, 0);

                DistanceConstraint dc1 = new DistanceConstraint(boxb, body, body.Position + JVector.Up * 6 + JVector.Backward * 5 + JVector.Down * 0.5f, body.Position);
                dc1.Softness = 1.0f;

                DistanceConstraint dc2 = new DistanceConstraint(boxb, body, body.Position + JVector.Up * 6 + JVector.Forward * 5 + JVector.Down * 0.5f, body.Position);
                dc2.Softness = 1.0f;

                dc1.BiasFactor = dc2.BiasFactor = 0.8f;

                dc1.IsMaxDistance = dc2.IsMaxDistance = false;

                this.Demo.World.AddBody(body);
                this.Demo.World.AddConstraint(dc1);
                this.Demo.World.AddConstraint(dc2);

                body.Restitution = 1.0f;
                body.StaticFriction = 1.0f;

              //  this.Demo.World.SetDampingFactors(1.0f, 1.0f);
            }

            //for (int i = 0; i < 5; i++)
            //{
            //    RigidBody sBody = new RigidBody(new SphereShape(0.5f));
            //    sBody.Position = new JVector(0, 0.5f, i);
            //    this.Demo.World.AddBody(sBody);
            //    sBody.Restitution = 1.0f;
            //    sBody.Friction = 0.0f;
            //}

            //for (int i = 0; i < 3; i++)
            //{
            //    RigidBody sBody = new RigidBody(new SphereShape(0.5f));
            //    sBody.Position = new JVector(0, 0.5f, 10 + i);
            //    this.Demo.World.AddBody(sBody);
            //    sBody.LinearVelocity = JVector.Forward * 3;
            //    sBody.Restitution = 1.0f;
            //    sBody.Friction = 0.0f;
            //}

      

            //this.Demo.World.SetDampingFactors(1, 1);


        }
Beispiel #5
0
        public Body CreateSphereBody(float radius, Vector3 position, bool isStatic = false)
        {
            var shape = new SphereShape(radius);
            var rigidBody = CreateRigidBody(shape, isStatic);

            rigidBody.Position = Conversion.ToJitterVector(ref position);

            var body = new Body(rigidBody);
            rigidBody.Tag = body;

            Bodies.Add(body);

            PhysicsWorld.AddBody(rigidBody);

            return body;
        }
 void IConstructable.Construct(IDictionary<string, string> param)
 {
     var type = param["type"];
     switch (type)
     {
         case "trimesh":
             var physData = ResourceFactory.LoadAsset<PhysicsData>(param["physData"]);
             Shape shape = new TriangleMeshShape(physData.Octree);
             Body = new RigidBody(shape) { Material = { Restitution = 0f, KineticFriction = 0f } };
             break;
         case "hull":
             physData = ResourceFactory.LoadAsset<PhysicsData>(param["physData"]);
             shape = new ConvexHullShape(physData.Vertices);
             Body = new RigidBody(shape);
             break;
         case "sphere":
             shape = new SphereShape(float.Parse(param["radius"], CultureInfo.InvariantCulture));
             Body = new RigidBody(shape);
             break;
         case "box":
             var d = param["size"].ConvertToVector();
             var offset = param.Get("offset", "0;0;0").ConvertToVector();
             shape = new BoxShape(2.0f * d.ToJVector());
             Body = new RigidBody(shape) { Position = offset.ToJVector() };
             break;
         case "capsule":
             var height = float.Parse(param["height"], CultureInfo.InvariantCulture);
             var radius = float.Parse(param["radius"], CultureInfo.InvariantCulture);
             shape = new CapsuleShape(height, radius);
             Body = new RigidBody(shape)
             {
                 Position = JVector.Backward * (0.5f * height + radius),
                 Orientation = JMatrix.CreateRotationX(MathHelper.PiOver2)
             };
             break;
         default:
             throw new Exception("Unknown shape: " + type);
     }
     Body.IsStatic = Convert.ToBoolean(param.Get("static", "false"));
     Body.Material.KineticFriction = 0.5f;
     Body.Material.StaticFriction = 0.5f;
     Body.Material.Restitution = 0.5f;
 }