diff options
| author | Sébastien Crozet <developer@crozet.re> | 2021-08-07 18:20:19 +0200 |
|---|---|---|
| committer | Sébastien Crozet <sebastien@crozet.re> | 2021-08-08 18:38:12 +0200 |
| commit | f7643272f40fa5776ce21a5ccdb43101d987030e (patch) | |
| tree | 0a5a374aa879f830b710d91d1ef1d2ea4d21793b /examples3d/joints3.rs | |
| parent | ac77c95c9c161948433ce3a05bab1f2e9fe32f61 (diff) | |
| download | rapier-f7643272f40fa5776ce21a5ccdb43101d987030e.tar.gz rapier-f7643272f40fa5776ce21a5ccdb43101d987030e.tar.bz2 rapier-f7643272f40fa5776ce21a5ccdb43101d987030e.zip | |
Implement limits for ball joints.
Diffstat (limited to 'examples3d/joints3.rs')
| -rw-r--r-- | examples3d/joints3.rs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/examples3d/joints3.rs b/examples3d/joints3.rs index 902d810..11cd533 100644 --- a/examples3d/joints3.rs +++ b/examples3d/joints3.rs @@ -368,6 +368,58 @@ fn create_ball_joints( } } +fn create_ball_joints_with_limits( + bodies: &mut RigidBodySet, + colliders: &mut ColliderSet, + joints: &mut JointSet, + origin: Point<f32>, +) { + let shift = vector![0.0, 0.0, 3.0]; + + let ground = bodies.insert( + RigidBodyBuilder::new_static() + .translation(origin.coords) + .build(), + ); + + let ball1 = bodies.insert( + RigidBodyBuilder::new_dynamic() + .translation(origin.coords + shift) + .linvel(vector![20.0, 20.0, 0.0]) + .build(), + ); + colliders.insert_with_parent( + ColliderBuilder::cuboid(1.0, 1.0, 1.0).build(), + ball1, + bodies, + ); + + let ball2 = bodies.insert( + RigidBodyBuilder::new_dynamic() + .translation(origin.coords + shift * 2.0) + .build(), + ); + colliders.insert_with_parent( + ColliderBuilder::cuboid(1.0, 1.0, 1.0).build(), + ball2, + bodies, + ); + + let mut joint1 = BallJoint::new(Point::origin(), Point::from(-shift)); + joint1.limits_enabled = true; + joint1.limits_local_axis1 = Vector::z_axis(); + joint1.limits_local_axis2 = Vector::z_axis(); + joint1.limits_angle = 0.2; + joints.insert(ground, ball1, joint1); + + let mut joint2 = BallJoint::new(Point::origin(), Point::from(-shift)); + joint2.limits_enabled = true; + joint2.limits_local_axis1 = Vector::z_axis(); + joint2.limits_local_axis2 = Vector::z_axis(); + joint2.limits_angle = 0.3; + joints.insert(ball1, ball2, joint2); +} + fn create_actuated_revolute_joints( bodies: &mut RigidBodySet, colliders: &mut ColliderSet, @@ -549,6 +601,12 @@ pub fn init_world(testbed: &mut Testbed) { 3, ); create_ball_joints(&mut bodies, &mut colliders, &mut joints, 15); + create_ball_joints_with_limits( + &mut bodies, + &mut colliders, + &mut joints, + point![-5.0, 0.0, 0.0], + ); /* * Set up the testbed. |
