aboutsummaryrefslogtreecommitdiff
path: root/examples2d/s2d_joint_grid.rs
diff options
context:
space:
mode:
authorThierry Berger <contact@thierryberger.com>2024-06-03 15:20:24 +0200
committerThierry Berger <contact@thierryberger.com>2024-06-03 15:20:24 +0200
commite1ed90603e618e28f48916690d761e0d8213e2ad (patch)
tree8399da9825ca9ee8edd601b1265e818fa303b541 /examples2d/s2d_joint_grid.rs
parentfe336b9b98d5825544ad3a153a84cb59dc9171c6 (diff)
parent856675032e76b6eb4bc9e0be4dc87abdbcfe0421 (diff)
downloadrapier-e1ed90603e618e28f48916690d761e0d8213e2ad.tar.gz
rapier-e1ed90603e618e28f48916690d761e0d8213e2ad.tar.bz2
rapier-e1ed90603e618e28f48916690d761e0d8213e2ad.zip
Merge branch 'master' into collider-builder-debug
Diffstat (limited to 'examples2d/s2d_joint_grid.rs')
-rw-r--r--examples2d/s2d_joint_grid.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/examples2d/s2d_joint_grid.rs b/examples2d/s2d_joint_grid.rs
new file mode 100644
index 0000000..0033c70
--- /dev/null
+++ b/examples2d/s2d_joint_grid.rs
@@ -0,0 +1,63 @@
+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 mut impulse_joints = ImpulseJointSet::new();
+ let multibody_joints = MultibodyJointSet::new();
+
+ /*
+ * Create the joint grid.
+ */
+ let rad = 0.4;
+ let numi = 100;
+ let numk = 100;
+ let shift = 1.0;
+ let mut index = 0;
+ let mut handles = vec![RigidBodyHandle::invalid(); numi * numk];
+
+ for k in 0..numk {
+ for i in 0..numi {
+ let body_type = if k >= numk / 2 - 3 && k <= numk / 2 + 3 && i == 0 {
+ RigidBodyType::Fixed
+ } else {
+ RigidBodyType::Dynamic
+ };
+
+ let rigid_body = RigidBodyBuilder::new(body_type)
+ .translation(vector![k as f32 * shift, -(i as f32) * shift]);
+ let handle = bodies.insert(rigid_body);
+ let collider = ColliderBuilder::ball(rad);
+ colliders.insert_with_parent(collider, handle, &mut bodies);
+
+ if i > 0 {
+ let joint = RevoluteJointBuilder::new()
+ .local_anchor1(point![0.0, -0.5 * shift])
+ .local_anchor2(point![0.0, 0.5 * shift])
+ .contacts_enabled(false);
+ impulse_joints.insert(handles[index - 1], handle, joint, true);
+ }
+
+ if k > 0 {
+ let joint = RevoluteJointBuilder::new()
+ .local_anchor1(point![0.5 * shift, 0.0])
+ .local_anchor2(point![-0.5 * shift, 0.0])
+ .contacts_enabled(false);
+ impulse_joints.insert(handles[index - numi], handle, joint, true);
+ }
+
+ handles[index] = handle;
+ index += 1;
+ }
+ }
+
+ /*
+ * Set up the testbed.
+ */
+ testbed.set_world(bodies, colliders, impulse_joints, multibody_joints);
+ testbed.look_at(point![0.0, 2.5], 20.0);
+}