public unsafe override void Initialize(ContentArchive content, Camera camera) { camera.Position = new Vector3(-30, 8, -60); camera.Yaw = MathHelper.Pi * 3f / 4; camera.Pitch = 0; //The PositionFirstTimestepper is the simplest timestepping mode, but since it integrates velocity into position at the start of the frame, directly modified velocities outside of the timestep //will be integrated before collision detection or the solver has a chance to intervene. That's fine in this demo. Other built-in options include the PositionLastTimestepper and the SubsteppingTimestepper. //Note that the timestepper also has callbacks that you can use for executing logic between processing stages, like BeforeCollisionDetection. Simulation = Simulation.Create(BufferPool, new DemoNarrowPhaseCallbacks(), new DemoPoseIntegratorCallbacks(new Vector3(0, -10, 0)), new PositionFirstTimestepper()); var boxShape = new Box(1, 1, 1); boxShape.ComputeInertia(1, out var boxInertia); var boxIndex = Simulation.Shapes.Add(boxShape); const int forkCount = 20; const int blocksPerChain = 20; BodyHandle[] blockHandles = new BodyHandle[blocksPerChain]; for (int forkIndex = 0; forkIndex < forkCount; ++forkIndex) { //Build the blocks. for (int blockIndex = 0; blockIndex < blocksPerChain; ++blockIndex) { var bodyDescription = BodyDescription.CreateDynamic( new Vector3(0, 5 + blockIndex * (boxShape.Height + 1), (forkIndex - forkCount * 0.5f) * (boxShape.Length + 4)), //Make the uppermost block kinematic to hold up the rest of the chain. blockIndex == blocksPerChain - 1 ? new BodyInertia() : boxInertia, new CollidableDescription(boxIndex, .1f), new BodyActivityDescription(.01f, 32)); blockHandles[blockIndex] = Simulation.Bodies.Add(bodyDescription); } //Build the chains. for (int i = 1; i < blocksPerChain; ++i) { var ballSocket = new BallSocket { LocalOffsetA = new Vector3(0, 1f, 0), LocalOffsetB = new Vector3(0, -1f, 0), SpringSettings = new SpringSettings(30, 5) }; Simulation.Solver.Add(blockHandles[i - 1], blockHandles[i], ref ballSocket); } } Simulation.Statics.Add(new StaticDescription(new Vector3(1, -0.5f, 1), new CollidableDescription(Simulation.Shapes.Add(new Box(200, 1, 200)), 0.1f))); //Build the coin description for the ponz-I mean ICO. var coinShape = new Cylinder(1.5f, 0.2f); coinShape.ComputeInertia(1, out var coinInertia); coinDescription = BodyDescription.CreateDynamic(RigidPose.Identity, coinInertia, new CollidableDescription(Simulation.Shapes.Add(coinShape), 0.1f), new BodyActivityDescription(0.01f)); }
//Default constructor public EnemyEntity(Vector3 SpawnLocation) { //Store the entities default location then add a new physics collider into the world physics simulation DefaultLocation = SpawnLocation; EntityColliderShape = new Cylinder(0.6f, 1.7f); EntityColliderDescription = new CollidableDescription(Program.World.World.Shapes.Add(EntityColliderShape), 0.25f); EntityColliderShape.ComputeInertia(1, out var Inertia); Program.World.World.Bodies.Add(BodyDescription.CreateDynamic(new RigidPose(SpawnLocation, Quaternion.Identity), Inertia, EntityColliderDescription, new BodyActivityDescription(0.01f))); //Pass it to the entity manager to be stored with all the others and set the enemies type value EntityManager.AddEntity(this); this.Type = "Skeleton Warrior"; }
public static CylinderBody Create(PhysicsSimulation simulation, Vector3 position, Quaternion rotation, Vector2 size) { var shape = new Cylinder(size.X, size.Y); shape.ComputeInertia(1, out var inertia); var index = simulation.Simulation.Shapes.Add(shape); var collidable = new CollidableDescription(index, 0.1f); var activity = new BodyActivityDescription(0); var pose = new RigidPose(position, rotation); var descriptor = BodyDescription.CreateDynamic(pose, inertia, collidable, activity); var handle = simulation.Simulation.Bodies.Add(descriptor); var obj = new CylinderBody(simulation, handle); simulation.Register(obj); return(obj); }
public unsafe override void Initialize(ContentArchive content, Camera camera) { camera.Position = new Vector3(-30, 10, -30); //camera.Yaw = MathHelper.Pi ; camera.Yaw = MathHelper.Pi * 3f / 4; //camera.Pitch = MathHelper.PiOver2 * 0.999f; Simulation = Simulation.Create(BufferPool, new DemoNarrowPhaseCallbacks(), new DemoPoseIntegratorCallbacks(new Vector3(0, -10, 0))); Simulation.Deterministic = true; var sphere = new Sphere(1.5f); var capsule = new Capsule(1f, 1f); var box = new Box(1f, 3f, 2f); var cylinder = new Cylinder(1.5f, 0.3f); const int pointCount = 32; var points = new QuickList <Vector3>(pointCount, BufferPool); //points.Allocate(BufferPool) = new Vector3(0, 0, 0); //points.Allocate(BufferPool) = new Vector3(0, 0, 1); //points.Allocate(BufferPool) = new Vector3(0, 1, 0); //points.Allocate(BufferPool) = new Vector3(0, 1, 1); //points.Allocate(BufferPool) = new Vector3(1, 0, 0); //points.Allocate(BufferPool) = new Vector3(1, 0, 1); //points.Allocate(BufferPool) = new Vector3(1, 1, 0); //points.Allocate(BufferPool) = new Vector3(1, 1, 1); var random = new Random(5); for (int i = 0; i < pointCount; ++i) { points.AllocateUnsafely() = new Vector3(3 * (float)random.NextDouble(), 1 * (float)random.NextDouble(), 3 * (float)random.NextDouble()); //points.AllocateUnsafely() = new Vector3(0, 1, 0) + Vector3.Normalize(new Vector3((float)random.NextDouble() * 2 - 1, (float)random.NextDouble() * 2 - 1, (float)random.NextDouble() * 2 - 1)) * (float)random.NextDouble(); } var convexHull = new ConvexHull(points.Span.Slice(points.Count), BufferPool, out _); box.ComputeInertia(1, out var boxInertia); capsule.ComputeInertia(1, out var capsuleInertia); sphere.ComputeInertia(1, out var sphereInertia); cylinder.ComputeInertia(1, out var cylinderInertia); convexHull.ComputeInertia(1, out var hullInertia); var boxIndex = Simulation.Shapes.Add(box); var capsuleIndex = Simulation.Shapes.Add(capsule); var sphereIndex = Simulation.Shapes.Add(sphere); var cylinderIndex = Simulation.Shapes.Add(cylinder); var hullIndex = Simulation.Shapes.Add(convexHull); const int width = 8; const int height = 16; const int length = 8; var shapeCount = 0; for (int i = 0; i < width; ++i) { for (int j = 0; j < height; ++j) { for (int k = 0; k < length; ++k) { var location = new Vector3(6, 3, 6) * new Vector3(i, j, k) + new Vector3(-width * 1.5f, 5.5f, -length * 1.5f); var bodyDescription = new BodyDescription { Activity = new BodyActivityDescription(0.01f), Pose = new RigidPose { Orientation = Quaternion.Identity, Position = location }, Collidable = new CollidableDescription { Continuity = new ContinuousDetectionSettings { Mode = ContinuousDetectionMode.Discrete }, SpeculativeMargin = 0.1f } }; var index = shapeCount++; switch (2 + index % 5) { case 0: bodyDescription.Collidable.Shape = sphereIndex; bodyDescription.LocalInertia = sphereInertia; break; case 1: bodyDescription.Collidable.Shape = capsuleIndex; bodyDescription.LocalInertia = capsuleInertia; break; case 2: bodyDescription.Collidable.Shape = boxIndex; bodyDescription.LocalInertia = boxInertia; break; case 3: bodyDescription.Collidable.Shape = cylinderIndex; bodyDescription.LocalInertia = cylinderInertia; break; case 4: bodyDescription.Collidable.Shape = hullIndex; bodyDescription.LocalInertia = hullInertia; break; } Simulation.Bodies.Add(bodyDescription); } } } DemoMeshHelper.CreateDeformedPlane(128, 128, (x, y) => new Vector3(x - 64, 2f * (float)(Math.Sin(x * 0.5f) * Math.Sin(y * 0.5f)), y - 64), new Vector3(4, 1, 4), BufferPool, out var mesh); Simulation.Statics.Add(new StaticDescription(new Vector3(), new CollidableDescription(Simulation.Shapes.Add(mesh), 0.1f))); }
public unsafe override void Initialize(ContentArchive content, Camera camera) { camera.Position = new Vector3(-30, 8, -60); camera.Yaw = MathHelper.Pi * 3f / 4; camera.Pitch = 0; Simulation = Simulation.Create(BufferPool, new DemoNarrowPhaseCallbacks(), new DemoPoseIntegratorCallbacks(new Vector3(0, -10, 0))); var boxShape = new Box(1, 1, 1); boxShape.ComputeInertia(1, out var boxInertia); var boxIndex = Simulation.Shapes.Add(boxShape); const int forkCount = 20; const int blocksPerChain = 20; int[] blockHandles = new int[blocksPerChain]; for (int forkIndex = 0; forkIndex < forkCount; ++forkIndex) { //Build the blocks. for (int blockIndex = 0; blockIndex < blocksPerChain; ++blockIndex) { var bodyDescription = new BodyDescription { //Make the uppermost block kinematic to hold up the rest of the chain. LocalInertia = blockIndex == blocksPerChain - 1 ? new BodyInertia() : boxInertia, Pose = new RigidPose { Position = new Vector3(0, 5 + blockIndex * (boxShape.Height + 1), (forkIndex - forkCount * 0.5f) * (boxShape.Length + 4)), Orientation = Quaternion.Identity }, Activity = new BodyActivityDescription { MinimumTimestepCountUnderThreshold = 32, SleepThreshold = .01f }, Collidable = new CollidableDescription { Shape = boxIndex, SpeculativeMargin = .1f }, }; blockHandles[blockIndex] = Simulation.Bodies.Add(bodyDescription); } //Build the chains. for (int i = 1; i < blocksPerChain; ++i) { var ballSocket = new BallSocket { LocalOffsetA = new Vector3(0, 1f, 0), LocalOffsetB = new Vector3(0, -1f, 0), SpringSettings = new SpringSettings(30, 5) }; Simulation.Solver.AddRef(blockHandles[i - 1], blockHandles[i], ref ballSocket); } } var staticShape = new Box(200, 1, 200); var staticShapeIndex = Simulation.Shapes.Add(staticShape); var staticDescription = new StaticDescription { Collidable = new CollidableDescription { Continuity = new ContinuousDetectionSettings { Mode = ContinuousDetectionMode.Discrete }, Shape = staticShapeIndex, SpeculativeMargin = 0.1f }, Pose = new RigidPose { Position = new Vector3(1, -0.5f, 1), Orientation = Quaternion.Identity } }; Simulation.Statics.Add(staticDescription); //Build the coin description for the ponz-I mean ICO. var coinShape = new Cylinder(1.5f, 0.2f); coinShape.ComputeInertia(1, out var coinInertia); coinDescription = BodyDescription.CreateDynamic(RigidPose.Identity, coinInertia, new CollidableDescription(Simulation.Shapes.Add(coinShape), 0.1f), new BodyActivityDescription(0.01f)); }
public void ComputeAnalyticInertia(float mass, out BodyInertia inertia) { Cylinder.ComputeInertia(mass, out inertia); }
public override void Initialize(ContentArchive content, Camera camera) { camera.Position = new Vector3(0, 5, 10); camera.Yaw = 0; camera.Pitch = 0; bodyProperties = new CollidableProperty <TankDemoBodyProperties>(); //We assign velocities outside of the timestep to fire bullets, so using the PositionLastTimestepper avoids integrating those velocities into positions before the solver has a chance to intervene. //We could have also modified velocities in the PositionFirstTimestepper's BeforeCollisionDetection callback, but it's just a little simpler to do this with very little cost. Simulation = Simulation.Create(BufferPool, new TankCallbacks() { Properties = bodyProperties }, new DemoPoseIntegratorCallbacks(new Vector3(0, -10, 0)), new PositionLastTimestepper()); var builder = new CompoundBuilder(BufferPool, Simulation.Shapes, 2); builder.Add(new Box(1.85f, 0.7f, 4.73f), RigidPose.Identity, 10); builder.Add(new Box(1.85f, 0.6f, 2.5f), new RigidPose(new Vector3(0, 0.65f, -0.35f)), 0.5f); builder.BuildDynamicCompound(out var children, out var bodyInertia, out _); builder.Dispose(); var bodyShape = new Compound(children); var bodyShapeIndex = Simulation.Shapes.Add(bodyShape); var wheelShape = new Cylinder(0.4f, .18f); wheelShape.ComputeInertia(0.25f, out var wheelInertia); var wheelShapeIndex = Simulation.Shapes.Add(wheelShape); var projectileShape = new Sphere(0.1f); projectileShape.ComputeInertia(0.2f, out var projectileInertia); var tankDescription = new TankDescription { Body = TankPartDescription.Create(10, new Box(4f, 1, 5), RigidPose.Identity, 0.5f, Simulation.Shapes), Turret = TankPartDescription.Create(1, new Box(1.5f, 0.7f, 2f), new RigidPose(new Vector3(0, 0.85f, 0.4f)), 0.5f, Simulation.Shapes), Barrel = TankPartDescription.Create(0.5f, new Box(0.2f, 0.2f, 3f), new RigidPose(new Vector3(0, 0.85f, 0.4f - 1f - 1.5f)), 0.5f, Simulation.Shapes), TurretAnchor = new Vector3(0f, 0.5f, 0.4f), BarrelAnchor = new Vector3(0, 0.5f + 0.35f, 0.4f - 1f), TurretBasis = Quaternion.Identity, TurretServo = new ServoSettings(1f, 0f, 40f), TurretSpring = new SpringSettings(10f, 1f), BarrelServo = new ServoSettings(1f, 0f, 40f), BarrelSpring = new SpringSettings(10f, 1f), ProjectileShape = Simulation.Shapes.Add(projectileShape), ProjectileSpeed = 100f, BarrelLocalProjectileSpawn = new Vector3(0, 0, -1.5f), ProjectileInertia = projectileInertia, LeftTreadOffset = new Vector3(-1.9f, 0f, 0), RightTreadOffset = new Vector3(1.9f, 0f, 0), SuspensionLength = 1f, SuspensionSettings = new SpringSettings(2.5f, 1.5f), WheelShape = wheelShapeIndex, WheelInertia = wheelInertia, WheelFriction = 2f, TreadSpacing = 1f, WheelCountPerTread = 5, WheelOrientation = QuaternionEx.CreateFromAxisAngle(Vector3.UnitZ, MathF.PI * -0.5f), }; playerController = new TankController(Tank.Create(Simulation, bodyProperties, BufferPool, new RigidPose(new Vector3(0, 10, 0), Quaternion.Identity), tankDescription), 20, 5, 2, 1, 3.5f); const int planeWidth = 257; const float terrainScale = 3; const float inverseTerrainScale = 1f / terrainScale; var terrainPosition = new Vector2(1 - planeWidth, 1 - planeWidth) * terrainScale * 0.5f; random = new Random(5); //Add some building-ish landmarks. var landmarkMin = new Vector3(planeWidth * terrainScale * -0.45f, 0, planeWidth * terrainScale * -0.45f); var landmarkMax = new Vector3(planeWidth * terrainScale * 0.45f, 0, planeWidth * terrainScale * 0.45f); var landmarkSpan = landmarkMax - landmarkMin; for (int j = 0; j < 25; ++j) { var buildingShape = new Box(10 + (float)random.NextDouble() * 10, 20 + (float)random.NextDouble() * 20, 10 + (float)random.NextDouble() * 10); var position = landmarkMin + landmarkSpan * new Vector3((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble()); Simulation.Statics.Add(new StaticDescription( new Vector3(0, buildingShape.HalfHeight - 4f + GetHeightForPosition(position.X, position.Z, planeWidth, inverseTerrainScale, terrainPosition), 0) + position, QuaternionEx.CreateFromAxisAngle(Vector3.UnitY, (float)random.NextDouble() * MathF.PI), new CollidableDescription(Simulation.Shapes.Add(buildingShape), 0.1f))); } DemoMeshHelper.CreateDeformedPlane(planeWidth, planeWidth, (int vX, int vY) => { var position2D = new Vector2(vX, vY) * terrainScale + terrainPosition; return(new Vector3(position2D.X, GetHeightForPosition(position2D.X, position2D.Y, planeWidth, inverseTerrainScale, terrainPosition), position2D.Y)); }, new Vector3(1, 1, 1), BufferPool, out var planeMesh); Simulation.Statics.Add(new StaticDescription(new Vector3(0, 0, 0), new CollidableDescription(Simulation.Shapes.Add(planeMesh), 0.1f))); explosions = new QuickList <Explosion>(32, BufferPool); //Create the AI tanks. const int aiTankCount = 100; aiTanks = new QuickList <AITank>(aiTankCount, BufferPool); playAreaMin = new Vector2(landmarkMin.X, landmarkMin.Z); playAreaMax = new Vector2(landmarkMax.X, landmarkMax.Z); var playAreaSpan = playAreaMax - playAreaMin; for (int i = 0; i < aiTankCount; ++i) { var horizontalPosition = playAreaMin + new Vector2((float)random.NextDouble(), (float)random.NextDouble()) * playAreaSpan; aiTanks.AllocateUnsafely() = new AITank { Controller = new TankController( Tank.Create(Simulation, bodyProperties, BufferPool, new RigidPose( new Vector3(horizontalPosition.X, 10, horizontalPosition.Y), QuaternionEx.CreateFromAxisAngle(new Vector3(0, 1, 0), (float)random.NextDouble() * 0.1f)), tankDescription), 20, 5, 2, 1, 3.5f), HitPoints = 5 }; } }
public override void Initialize(ContentArchive content, Camera camera) { camera.Position = new Vector3(0, 5, 10); camera.Yaw = 0; camera.Pitch = 0; var properties = new BodyProperty <CarBodyProperties>(); Simulation = Simulation.Create(BufferPool, new CarCallbacks() { Properties = properties }, new DemoPoseIntegratorCallbacks(new Vector3(0, -10, 0))); var builder = new CompoundBuilder(BufferPool, Simulation.Shapes, 2); builder.Add(new Box(1.85f, 0.7f, 4.73f), RigidPose.Identity, 10); builder.Add(new Box(1.85f, 0.6f, 2.5f), new RigidPose(new Vector3(0, 0.65f, -0.35f)), 0.5f); builder.BuildDynamicCompound(out var children, out var bodyInertia, out _); builder.Dispose(); var bodyShape = new Compound(children); var bodyShapeIndex = Simulation.Shapes.Add(bodyShape); var wheelShape = new Cylinder(0.4f, .18f); wheelShape.ComputeInertia(0.25f, out var wheelInertia); var wheelShapeIndex = Simulation.Shapes.Add(wheelShape); const float x = 0.9f; const float y = -0.1f; const float frontZ = 1.7f; const float backZ = -1.7f; playerController = new SimpleCarController(SimpleCar.Create(Simulation, properties, new RigidPose(new Vector3(0, 10, 0), Quaternion.Identity), bodyShapeIndex, bodyInertia, 0.5f, wheelShapeIndex, wheelInertia, 2f, new Vector3(-x, y, frontZ), new Vector3(x, y, frontZ), new Vector3(-x, y, backZ), new Vector3(x, y, backZ), new Vector3(0, -1, 0), 0.25f, new SpringSettings(5f, 0.7f), Quaternion.CreateFromAxisAngle(Vector3.UnitZ, MathF.PI * 0.5f)), forwardSpeed: 75, forwardForce: 6, zoomMultiplier: 2, backwardSpeed: 30, backwardForce: 4, idleForce: 0.25f, brakeForce: 7, steeringSpeed: 1.5f, maximumSteeringAngle: MathF.PI * 0.23f); //Create a bunch of AI cars to race against. const int aiCount = 384; BufferPool.Take(aiCount, out aiControllers); const int planeWidth = 257; const float scale = 3; Vector2 terrainPosition = new Vector2(1 - planeWidth, 1 - planeWidth) * scale * 0.5f; raceTrack = new RaceTrack { QuadrantRadius = (planeWidth - 32) * scale * 0.25f, Center = default }; var random = new Random(5); //Add some building-ish landmarks in the middle of each of the four racetrack quadrants. for (int i = 0; i < 4; ++i) { var landmarkCenter = new Vector3((i & 1) * raceTrack.QuadrantRadius * 2 - raceTrack.QuadrantRadius, -20, (i & 2) * raceTrack.QuadrantRadius - raceTrack.QuadrantRadius); var landmarkMin = landmarkCenter - new Vector3(raceTrack.QuadrantRadius * 0.5f, 0, raceTrack.QuadrantRadius * 0.5f); var landmarkSpan = new Vector3(raceTrack.QuadrantRadius, 0, raceTrack.QuadrantRadius); for (int j = 0; j < 25; ++j) { var buildingShape = new Box(10 + (float)random.NextDouble() * 10, 20 + (float)random.NextDouble() * 20, 10 + (float)random.NextDouble() * 10); Simulation.Statics.Add(new StaticDescription( new Vector3(0, buildingShape.HalfHeight, 0) + landmarkMin + landmarkSpan * new Vector3((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble()), Quaternion.CreateFromAxisAngle(Vector3.UnitY, (float)random.NextDouble() * MathF.PI), new CollidableDescription(Simulation.Shapes.Add(buildingShape), 0.1f))); } } Vector3 min = new Vector3(-planeWidth * scale * 0.45f, 10, -planeWidth * scale * 0.45f); Vector3 span = new Vector3(planeWidth * scale * 0.9f, 15, planeWidth * scale * 0.9f); for (int i = 0; i < aiCount; ++i) { //The AI cars are very similar, except... we handicap them a little to make the player good about themselves. var position = min + span * new Vector3((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble()); var orientation = Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), (float)random.NextDouble() * MathF.PI * 2); aiControllers[i].Controller = new SimpleCarController(SimpleCar.Create(Simulation, properties, new RigidPose(position, orientation), bodyShapeIndex, bodyInertia, 0.5f, wheelShapeIndex, wheelInertia, 2f, new Vector3(-x, y, frontZ), new Vector3(x, y, frontZ), new Vector3(-x, y, backZ), new Vector3(x, y, backZ), new Vector3(0, -1, 0), 0.25f, new SpringSettings(5, 0.7f), Quaternion.CreateFromAxisAngle(Vector3.UnitZ, MathF.PI * 0.5f)), forwardSpeed: 50, forwardForce: 5, zoomMultiplier: 2, backwardSpeed: 10, backwardForce: 4, idleForce: 0.25f, brakeForce: 7, steeringSpeed: 1.5f, maximumSteeringAngle: MathF.PI * 0.23f); aiControllers[i].LaneOffset = (float)random.NextDouble() * 20 - 10; } DemoMeshHelper.CreateDeformedPlane(planeWidth, planeWidth, (int vX, int vY) => { var octave0 = (MathF.Sin((vX + 5f) * 0.05f) + MathF.Sin((vY + 11) * 0.05f)) * 1.8f; var octave1 = (MathF.Sin((vX + 17) * 0.15f) + MathF.Sin((vY + 19) * 0.15f)) * 0.9f; var octave2 = (MathF.Sin((vX + 37) * 0.35f) + MathF.Sin((vY + 93) * 0.35f)) * 0.4f; var octave3 = (MathF.Sin((vX + 53) * 0.65f) + MathF.Sin((vY + 47) * 0.65f)) * 0.2f; var octave4 = (MathF.Sin((vX + 67) * 1.50f) + MathF.Sin((vY + 13) * 1.5f)) * 0.125f; var distanceToEdge = planeWidth / 2 - Math.Max(Math.Abs(vX - planeWidth / 2), Math.Abs(vY - planeWidth / 2)); var edgeRamp = 25f / (distanceToEdge + 1); var terrainHeight = octave0 + octave1 + octave2 + octave3 + octave4; var vertexPosition = new Vector2(vX * scale, vY * scale) + terrainPosition; var distanceToTrack = raceTrack.GetDistance(vertexPosition); var trackWeight = MathF.Min(1f, 3f / (distanceToTrack * 0.1f + 1f)); var height = trackWeight * -10f + terrainHeight * (1 - trackWeight); return(new Vector3(vertexPosition.X, height + edgeRamp, vertexPosition.Y)); }, new Vector3(1, 1, 1), BufferPool, out var planeMesh); Simulation.Statics.Add(new StaticDescription(new Vector3(0, -15, 0), Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), MathF.PI / 2), new CollidableDescription(Simulation.Shapes.Add(planeMesh), 0.1f))); }
public unsafe override void Initialize(ContentArchive content, Camera camera) { camera.Position = new Vector3(-10, 0, -10); //camera.Yaw = MathHelper.Pi ; camera.Yaw = MathHelper.Pi * 3f / 4; //camera.Pitch = MathHelper.PiOver2 * 0.999f; Simulation = Simulation.Create(BufferPool, new DemoNarrowPhaseCallbacks(), new DemoPoseIntegratorCallbacks(new Vector3(0, -10, 0))); var box = new Box(1f, 3f, 2f); var capsule = new Capsule(1f, 1f); var sphere = new Sphere(1f); box.ComputeInertia(1, out var boxInertia); capsule.ComputeInertia(1, out var capsuleInertia); sphere.ComputeInertia(1, out var sphereInertia); var boxIndex = Simulation.Shapes.Add(box); var capsuleIndex = Simulation.Shapes.Add(capsule); var sphereIndex = Simulation.Shapes.Add(sphere); const int width = 16; const int height = 0; const int length = 16; for (int i = 0; i < width; ++i) { for (int j = 0; j < height; ++j) { for (int k = 0; k < length; ++k) { var location = new Vector3(5, 5, 5) * new Vector3(i, j, k);// + new Vector3(-width * 1.5f, 1.5f, -length * 1.5f); var bodyDescription = new BodyDescription { Activity = new BodyActivityDescription { MinimumTimestepCountUnderThreshold = 32, SleepThreshold = 0.01f }, Pose = new RigidPose { Orientation = BepuUtilities.Quaternion.Identity, Position = location }, Collidable = new CollidableDescription { Continuity = new ContinuousDetectionSettings { Mode = ContinuousDetectionMode.Discrete }, SpeculativeMargin = 0.1f } }; switch ((i + j) % 3) { case 0: bodyDescription.Collidable.Shape = sphereIndex; bodyDescription.LocalInertia = sphereInertia; break; case 1: bodyDescription.Collidable.Shape = capsuleIndex; bodyDescription.LocalInertia = capsuleInertia; break; case 2: bodyDescription.Collidable.Shape = boxIndex; bodyDescription.LocalInertia = boxInertia; break; } Simulation.Bodies.Add(bodyDescription); } } } var testShape = new Cylinder(1, 0.2f); testShape.ComputeInertia(1, out var testInertia); Simulation.Bodies.Add(BodyDescription.CreateDynamic(new Vector3(10, 10, 10), testInertia, new CollidableDescription(Simulation.Shapes.Add(testShape), 10.1f), new BodyActivityDescription(-0.01f))); //DemoMeshHelper.LoadModel(content, BufferPool, @"Content\newt.obj", new Vector3(5, 5, 5), out var newtMesh); //newtMesh.ComputeClosedInertia(10, out var newtInertia, out _); //Simulation.Bodies.Add(BodyDescription.CreateDynamic(new RigidPose(new Vector3(30, 20, 30)), newtInertia, // new CollidableDescription(Simulation.Shapes.Add(newtMesh), 0.1f), new BodyActivityDescription(0.01f))); //Simulation.Statics.Add(new StaticDescription(new Vector3(30, 15, 30), new CollidableDescription(Simulation.Shapes.Add(new Box(15, 1, 15)), 0.1f))); //DemoMeshHelper.LoadModel(content, BufferPool, @"Content\box.obj", new Vector3(5, 1, 5), out var boxMesh); //Simulation.Statics.Add(new StaticDescription(new Vector3(10, 5, -20), new CollidableDescription(Simulation.Shapes.Add(boxMesh), 0.1f))); //DemoMeshHelper.CreateFan(64, 16, new Vector3(1, 1, 1), BufferPool, out var fanMesh); //Simulation.Statics.Add(new StaticDescription(new Vector3(-10, 0, -20), new CollidableDescription(Simulation.Shapes.Add(fanMesh), 0.1f))); const int planeWidth = 128; const int planeHeight = 128; DemoMeshHelper.CreateDeformedPlane(planeWidth, planeHeight, (int x, int y) => { return(new Vector3(x - planeWidth / 2, 1 * MathF.Cos(x / 2f) * MathF.Sin(y / 2f), y - planeHeight / 2)); }, new Vector3(1, 0, 1), BufferPool, out var planeMesh); Simulation.Statics.Add(new StaticDescription(new Vector3(64, -10, 64), BepuUtilities.Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), MathF.PI / 2), new CollidableDescription(Simulation.Shapes.Add(planeMesh), 0.1f))); }