public unsafe override void Initialize(ContentArchive content, Camera camera) { camera.Position = new Vector3(0, 9, -40); camera.Yaw = MathHelper.Pi; camera.Pitch = 0; var filters = new BodyProperty <SubgroupCollisionFilter>(); Simulation = Simulation.Create(BufferPool, new SubgroupFilteredCallbacks { CollisionFilters = filters }, new DemoPoseIntegratorCallbacks(new Vector3(0, -10, 0))); int ragdollIndex = 0; var spacing = new Vector3(1.7f, 1.8f, 0.5f); int width = 4; int height = 4; int length = 44; var origin = -0.5f * spacing * new Vector3(width - 1, 0, length - 1) + new Vector3(0, 5f, 0); for (int i = 0; i < width; ++i) { for (int j = 0; j < height; ++j) { for (int k = 0; k < length; ++k) { RagdollDemo.AddRagdoll(origin + spacing * new Vector3(i, j, k), Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), MathHelper.Pi * 0.05f), ragdollIndex++, filters, Simulation); } } } var tubeCenter = new Vector3(0, 8, 0); const int panelCount = 20; const float tubeRadius = 6; var panelShape = new Box((float)Math.PI * 2 * tubeRadius / panelCount, 1, 80); var panelShapeIndex = Simulation.Shapes.Add(panelShape); var builder = new CompoundBuilder(BufferPool, Simulation.Shapes, panelCount + 1); for (int i = 0; i < panelCount; ++i) { var rotation = Quaternion.CreateFromAxisAngle(Vector3.UnitZ, i * MathHelper.TwoPi / panelCount); Quaternion.TransformUnitY(rotation, out var localUp); var position = localUp * tubeRadius; builder.AddForKinematic(panelShapeIndex, new RigidPose(position, rotation), 1); } builder.AddForKinematic(Simulation.Shapes.Add(new Box(1, 2, panelShape.Length)), new RigidPose(new Vector3(0, tubeRadius - 1, 0)), 0); builder.BuildKinematicCompound(out var children); var compound = new BigCompound(children, Simulation.Shapes, BufferPool); Simulation.Bodies.Add(BodyDescription.CreateKinematic(tubeCenter, new BodyVelocity(default, new Vector3(0, 0, .25f)), new CollidableDescription(Simulation.Shapes.Add(compound), 0.1f), new BodyActivityDescription()));