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