diff options
| author | Sébastien Crozet <developer@crozet.re> | 2022-10-02 17:36:30 +0200 |
|---|---|---|
| committer | Sébastien Crozet <developer@crozet.re> | 2022-10-02 17:36:30 +0200 |
| commit | 36e85d0708e53a01731dfa95a9a2b4792ef03fe2 (patch) | |
| tree | 3ab02f579d8cc603c0aca5b387a8b1368281320c /examples3d/newton_cradle3.rs | |
| parent | a1802323285622e0626cd69c7ea3b3ca60638b2e (diff) | |
| download | rapier-36e85d0708e53a01731dfa95a9a2b4792ef03fe2.tar.gz rapier-36e85d0708e53a01731dfa95a9a2b4792ef03fe2.tar.bz2 rapier-36e85d0708e53a01731dfa95a9a2b4792ef03fe2.zip | |
Add a character controller implementation
Diffstat (limited to 'examples3d/newton_cradle3.rs')
| -rw-r--r-- | examples3d/newton_cradle3.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/examples3d/newton_cradle3.rs b/examples3d/newton_cradle3.rs new file mode 100644 index 0000000..b281149 --- /dev/null +++ b/examples3d/newton_cradle3.rs @@ -0,0 +1,45 @@ +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 multibody_joints = MultibodyJointSet::new(); + + let radius = 0.5; + let length = 10.0 * radius; + let rb = RigidBodyBuilder::dynamic(); + let co = ColliderBuilder::ball(radius).restitution(1.0); + + let n = 5; + + for i in 0..n { + let (ball_pos, attach) = ( + vector![i as Real * 2.2 * radius, 0.0, 0.0], + Vector::y() * length, + ); + let vel = if i >= n - 1 { + vector![7.0, 0.0, 0.0] + } else { + Vector::zeros() + }; + + let ground = bodies.insert(RigidBodyBuilder::fixed().translation(ball_pos + attach)); + let rb = rb.clone().translation(ball_pos).linvel(vel); + let handle = bodies.insert(rb); + colliders.insert_with_parent(co.clone(), handle, &mut bodies); + + let joint = SphericalJointBuilder::new().local_anchor2(attach.into()); + impulse_joints.insert(ground, handle, joint, true); + } + + /* + * Set up the testbed. + */ + testbed.set_world(bodies, colliders, impulse_joints, multibody_joints); + testbed.look_at(point![100.0, 100.0, 100.0], Point::origin()); +} |
