diff options
| author | Sébastien Crozet <sebcrozet@dimforge.com> | 2024-01-21 21:02:23 +0100 |
|---|---|---|
| committer | Sébastien Crozet <sebcrozet@dimforge.com> | 2024-01-21 21:02:27 +0100 |
| commit | 9b87f06a856c4d673642e210f8b0986cfdbac3af (patch) | |
| tree | b4f4eaac0e5004f8ba3fccd42e5aea4fd565dcc6 /examples3d/debug_chain_high_mass_ratio3.rs | |
| parent | 9ac3503b879f95fcdf5414470ba5aedf195b9a97 (diff) | |
| download | rapier-9b87f06a856c4d673642e210f8b0986cfdbac3af.tar.gz rapier-9b87f06a856c4d673642e210f8b0986cfdbac3af.tar.bz2 rapier-9b87f06a856c4d673642e210f8b0986cfdbac3af.zip | |
feat: implement new "small-steps" solver + joint improvements
Diffstat (limited to 'examples3d/debug_chain_high_mass_ratio3.rs')
| -rw-r--r-- | examples3d/debug_chain_high_mass_ratio3.rs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/examples3d/debug_chain_high_mass_ratio3.rs b/examples3d/debug_chain_high_mass_ratio3.rs new file mode 100644 index 0000000..809311e --- /dev/null +++ b/examples3d/debug_chain_high_mass_ratio3.rs @@ -0,0 +1,73 @@ +use rapier3d::prelude::*; +use rapier_testbed3d::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 mut multibody_joints = MultibodyJointSet::new(); + let use_articulations = false; + + /* + * Create a chain with a very heavy ball at the end. + */ + let num = 17; + let rad = 0.2; + + let mut body_handles = Vec::new(); + + for i in 0..num { + let fi = i as f32; + + let status = if i == 0 { + RigidBodyType::Fixed + } else { + RigidBodyType::Dynamic + }; + + let ball_rad = if i == num - 1 { rad * 10.0 } else { rad }; + let shift1 = rad * 1.1; + let shift2 = ball_rad + rad * 0.1; + let z = if i == 0 { + 0.0 + } else { + (fi - 1.0) * 2.0 * shift1 + shift1 + shift2 + }; + + let rigid_body = RigidBodyBuilder::new(status) + .translation(vector![0.0, 0.0, z]) + .additional_solver_iterations(16); + let child_handle = bodies.insert(rigid_body); + let collider = ColliderBuilder::ball(ball_rad); + colliders.insert_with_parent(collider, child_handle, &mut bodies); + + // Vertical joint. + if i > 0 { + let parent_handle = *body_handles.last().unwrap(); + let joint = if i == 1 { + SphericalJointBuilder::new().local_anchor2(point![0.0, 0.0, -shift1 * 2.0]) + } else { + SphericalJointBuilder::new() + .local_anchor1(point![0.0, 0.0, shift1]) + .local_anchor2(point![0.0, 0.0, -shift2]) + }; + + if use_articulations { + multibody_joints.insert(parent_handle, child_handle, joint, true); + } else { + impulse_joints.insert(parent_handle, child_handle, joint, true); + } + } + + body_handles.push(child_handle); + } + + /* + * Set up the testbed. + */ + testbed.set_world(bodies, colliders, impulse_joints, multibody_joints); + testbed.look_at(point![10.0, 10.0, 10.0], Point::origin()); +} |
