aboutsummaryrefslogtreecommitdiff
path: root/examples2d/s2d_card_house.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples2d/s2d_card_house.rs')
-rw-r--r--examples2d/s2d_card_house.rs78
1 files changed, 78 insertions, 0 deletions
diff --git a/examples2d/s2d_card_house.rs b/examples2d/s2d_card_house.rs
new file mode 100644
index 0000000..5e2c5dc
--- /dev/null
+++ b/examples2d/s2d_card_house.rs
@@ -0,0 +1,78 @@
+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();
+
+ let friction = 0.7;
+
+ /*
+ * Ground
+ */
+ let rigid_body = RigidBodyBuilder::fixed().translation(vector![0.0, -2.0]);
+ let ground_handle = bodies.insert(rigid_body);
+ let collider = ColliderBuilder::cuboid(40.0, 2.0).friction(friction);
+ colliders.insert_with_parent(collider, ground_handle, &mut bodies);
+
+ /*
+ * Create the cubes
+ */
+ let scale = 10.0;
+ let card_height = 0.2 * scale;
+ let card_thickness = 0.001 * scale;
+ let angle0 = 25.0 * std::f32::consts::PI / 180.0;
+ let angle1 = -25.0 * std::f32::consts::PI / 180.0;
+ let angle2 = 0.5 * std::f32::consts::PI;
+
+ let card_box = ColliderBuilder::cuboid(card_thickness, card_height).friction(friction);
+
+ let mut nb = 5;
+ let mut z0 = 0.0;
+ let mut y = card_height - 0.02 * scale;
+
+ while nb != 0 {
+ let mut z = z0;
+
+ for i in 0..nb {
+ if i != nb - 1 {
+ let rigid_body = RigidBodyBuilder::dynamic()
+ .translation(vector![z + 0.25 * scale, y + card_height - 0.015 * scale])
+ .rotation(angle2);
+ let ground_handle = bodies.insert(rigid_body);
+ colliders.insert_with_parent(card_box.clone(), ground_handle, &mut bodies);
+ }
+
+ let rigid_body = RigidBodyBuilder::dynamic()
+ .translation(vector![z, y])
+ .rotation(angle1);
+ let ground_handle = bodies.insert(rigid_body);
+ colliders.insert_with_parent(card_box.clone(), ground_handle, &mut bodies);
+
+ z += 0.175 * scale;
+
+ let rigid_body = RigidBodyBuilder::dynamic()
+ .translation(vector![z, y])
+ .rotation(angle0);
+ let ground_handle = bodies.insert(rigid_body);
+ colliders.insert_with_parent(card_box.clone(), ground_handle, &mut bodies);
+
+ z += 0.175 * scale;
+ }
+
+ y += card_height * 2.0 - 0.03 * scale;
+ z0 += 0.175 * scale;
+ nb -= 1;
+ }
+
+ /*
+ * Set up the testbed.
+ */
+ testbed.set_world(bodies, colliders, impulse_joints, multibody_joints);
+ testbed.look_at(point![0.0, 2.5], 20.0);
+}