diff options
| author | Crozet Sébastien <developer@crozet.re> | 2020-10-26 15:58:30 +0100 |
|---|---|---|
| committer | Crozet Sébastien <developer@crozet.re> | 2020-10-26 15:58:30 +0100 |
| commit | 2b628f9580a826722346983ef42672d4e8dd8053 (patch) | |
| tree | 9e72cc1645140eda69696eedb3c245fb667eb540 /src_testbed/physx_backend.rs | |
| parent | 3da333f11c93898808eb9233c0cf333743bbf906 (diff) | |
| download | rapier-2b628f9580a826722346983ef42672d4e8dd8053.tar.gz rapier-2b628f9580a826722346983ef42672d4e8dd8053.tar.bz2 rapier-2b628f9580a826722346983ef42672d4e8dd8053.zip | |
Redefine capsules as a segment with a radius, allowing us to reuse the pfm_pfm_contact generator for it.
Diffstat (limited to 'src_testbed/physx_backend.rs')
| -rw-r--r-- | src_testbed/physx_backend.rs | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src_testbed/physx_backend.rs b/src_testbed/physx_backend.rs index 822ad08..7db3c4c 100644 --- a/src_testbed/physx_backend.rs +++ b/src_testbed/physx_backend.rs @@ -433,8 +433,15 @@ fn physx_collider_from_rapier_collider( } else if let Some(ball) = shape.as_ball() { ColliderDesc::Sphere(ball.radius) } else if let Some(capsule) = shape.as_capsule() { - let rot = UnitQuaternion::rotation_between(&Vector3::x(), &Vector3::y()); - local_pose *= rot.unwrap_or(UnitQuaternion::identity()); + let center = capsule.center(); + let mut dir = capsule.segment.b - capsule.segment.a; + + if dir.x < 0.0 { + dir = -dir; + } + + let rot = UnitQuaternion::rotation_between(&Vector3::x(), &dir); + local_pose *= Translation3::from(center.coords) * rot.unwrap_or(UnitQuaternion::identity()); ColliderDesc::Capsule(capsule.radius, capsule.height()) } else if let Some(trimesh) = shape.as_trimesh() { ColliderDesc::TriMesh { |
