private void AddBody <T>() where T : unmanaged, IConvexShape { T withType = (T)colliderShape; colliderShape.ComputeInertia(mass, out BodyInertia inertia); if (isStatic) { staticHandle = PhysicsHandler.Simulation.Statics.Add( new StaticDescription( parent.Movement.Position, new CollidableDescription( PhysicsHandler.Simulation.Shapes.Add(withType), 0.1f ) ) ); } else { bodyHandle = PhysicsHandler.Simulation.Bodies.Add( BodyDescription.CreateDynamic( parent.Movement.Position, inertia, new CollidableDescription( PhysicsHandler.Simulation.Shapes.Add(withType), 0.1f ), new BodyActivityDescription(0.01f) ) ); } }
protected virtual BodyInertia GetBodyInertia(IConvexShape shape, float mass) { shape.ComputeInertia(mass, out var bodyInertia); // this locks rotation along the X and Z axes, aiding 2d physics bodyInertia.InverseInertiaTensor.XX = 0; bodyInertia.InverseInertiaTensor.ZZ = 0; return(bodyInertia); }
public void SetCollider(PhysicsType type) { if (PhysicsBodyInitialized) { RemoveCollider(); if (type == PhysicsType.None) { PhysicsType = type; if (Physics.PhysicsObjects.Contains(this)) { Physics.PhysicsObjects.Remove(this); } return; } } if (type == PhysicsType.Cube) { Box shape = new Box(2.0f, 2.0f, 2.0f); ShapeIndex = Physics.simulator.Shapes.Add(shape); Shape = shape; } else if (type == PhysicsType.Sphere) { Sphere shape = new Sphere(2.0f); ShapeIndex = Physics.simulator.Shapes.Add(shape); Shape = shape; } Shape.ComputeInertia(Mass, out BodyInertia inertia); PhysicsDescription = BodyDescription.CreateDynamic(transform.Position, inertia, new CollidableDescription(ShapeIndex, 0.1f), new BodyActivityDescription(0.01f)); BodyHandle = Physics.simulator.Bodies.Add(PhysicsDescription); BodyReference = Physics.simulator.Bodies.GetBodyReference(BodyHandle); if (!Physics.PhysicsObjects.Contains(this)) { Physics.PhysicsObjects.Add(this); } PhysicsType = type; PhysicsBodyInitialized = true; physicsEnabled = true; }