From f58b4f7c195ab7acf0778ea65c46ebf37ac8188c Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sun, 21 Apr 2024 18:55:11 +0200 Subject: feat: add warmstarting to contact constraints resolution --- examples2d/s2d_joint_grid.rs | 68 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 examples2d/s2d_joint_grid.rs (limited to 'examples2d/s2d_joint_grid.rs') diff --git a/examples2d/s2d_joint_grid.rs b/examples2d/s2d_joint_grid.rs new file mode 100644 index 0000000..97cea07 --- /dev/null +++ b/examples2d/s2d_joint_grid.rs @@ -0,0 +1,68 @@ +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(); + + /* + * Ground + */ + let ground = bodies.insert(RigidBodyBuilder::fixed()); + + /* + * Create the bridge. + */ + 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); +} -- cgit From 0a9153e273dc0bdd4ba6443bd7f4dcfc671faac3 Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sun, 28 Apr 2024 18:23:30 +0200 Subject: chore: clippy fixes --- examples2d/s2d_joint_grid.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'examples2d/s2d_joint_grid.rs') diff --git a/examples2d/s2d_joint_grid.rs b/examples2d/s2d_joint_grid.rs index 97cea07..0033c70 100644 --- a/examples2d/s2d_joint_grid.rs +++ b/examples2d/s2d_joint_grid.rs @@ -11,12 +11,7 @@ pub fn init_world(testbed: &mut Testbed) { let multibody_joints = MultibodyJointSet::new(); /* - * Ground - */ - let ground = bodies.insert(RigidBodyBuilder::fixed()); - - /* - * Create the bridge. + * Create the joint grid. */ let rad = 0.4; let numi = 100; -- cgit