aboutsummaryrefslogtreecommitdiff
path: root/examples2d
diff options
context:
space:
mode:
Diffstat (limited to 'examples2d')
-rw-r--r--examples2d/all_examples2.rs2
-rw-r--r--examples2d/drum2.rs81
2 files changed, 83 insertions, 0 deletions
diff --git a/examples2d/all_examples2.rs b/examples2d/all_examples2.rs
index 0aedcc2..3a97d39 100644
--- a/examples2d/all_examples2.rs
+++ b/examples2d/all_examples2.rs
@@ -14,6 +14,7 @@ mod collision_groups2;
mod convex_polygons2;
mod damping2;
mod debug_box_ball2;
+mod drum2;
mod heightfield2;
mod joints2;
mod locked_rotations2;
@@ -63,6 +64,7 @@ pub fn main() {
("Collision groups", collision_groups2::init_world),
("Convex polygons", convex_polygons2::init_world),
("Damping", damping2::init_world),
+ ("Drum", drum2::init_world),
("Heightfield", heightfield2::init_world),
("Joints", joints2::init_world),
("Locked rotations", locked_rotations2::init_world),
diff --git a/examples2d/drum2.rs b/examples2d/drum2.rs
new file mode 100644
index 0000000..9bc8a37
--- /dev/null
+++ b/examples2d/drum2.rs
@@ -0,0 +1,81 @@
+use rapier2d::prelude::*;
+use rapier_testbed2d::Testbed;
+
+pub fn init_world(testbed: &mut Testbed) {
+ /*
+ * World
+ */
+ let mut bodies = RigidBodySet::new();
+ let mut colliders = ColliderSet::new();
+ let impulse_joints = ImpulseJointSet::new();
+ let multibody_joints = MultibodyJointSet::new();
+
+ /*
+ * Create the boxes
+ */
+ let num = 30;
+ let rad = 0.2;
+
+ let shift = rad * 2.0;
+ let centerx = shift * num as f32 / 2.0;
+ let centery = shift * num as f32 / 2.0;
+
+ for i in 0usize..num {
+ for j in 0usize..num {
+ let x = i as f32 * shift - centerx;
+ let y = j as f32 * shift - centery;
+
+ // Build the rigid body.
+ let rigid_body = RigidBodyBuilder::new_dynamic()
+ .translation(vector![x, y])
+ .build();
+ let handle = bodies.insert(rigid_body);
+ let collider = ColliderBuilder::cuboid(rad, rad).build();
+ colliders.insert_with_parent(collider, handle, &mut bodies);
+ }
+ }
+
+ /*
+ * Setup a velocity-based kinematic rigid body.
+ */
+ let platform_body = RigidBodyBuilder::new_kinematic_velocity_based().build();
+ let velocity_based_platform_handle = bodies.insert(platform_body);
+
+ let sides = [
+ (10.0, 0.25, vector![0.0, 10.0]),
+ (10.0, 0.25, vector![0.0, -10.0]),
+ (0.25, 10.0, vector![10.0, 0.0]),
+ (0.25, 10.0, vector![-10.0, 0.0]),
+ ];
+ let balls = [
+ (1.25, vector![6.0, 6.0]),
+ (1.25, vector![-6.0, 6.0]),
+ (1.25, vector![6.0, -6.0]),
+ (1.25, vector![-6.0, -6.0]),
+ ];
+
+ for (hx, hy, pos) in sides {
+ let collider = ColliderBuilder::cuboid(hx, hy).translation(pos).build();
+ colliders.insert_with_parent(collider, velocity_based_platform_handle, &mut bodies);
+ }
+ for (r, pos) in balls {
+ let collider = ColliderBuilder::ball(r).translation(pos).build();
+ colliders.insert_with_parent(collider, velocity_based_platform_handle, &mut bodies);
+ }
+
+ /*
+ * Setup a callback to control the platform.
+ */
+ testbed.add_callback(move |_, physics, _, _| {
+ // Update the velocity-based kinematic body by setting its velocity.
+ if let Some(platform) = physics.bodies.get_mut(velocity_based_platform_handle) {
+ platform.set_angvel(-0.15, true);
+ }
+ });
+
+ /*
+ * Run the simulation.
+ */
+ testbed.set_world(bodies, colliders, impulse_joints, multibody_joints);
+ testbed.look_at(point![0.0, 1.0], 40.0);
+}