From 2b628f9580a826722346983ef42672d4e8dd8053 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Mon, 26 Oct 2020 15:58:30 +0100 Subject: Redefine capsules as a segment with a radius, allowing us to reuse the pfm_pfm_contact generator for it. --- src_testbed/nphysics_backend.rs | 3 ++- src_testbed/objects/capsule.rs | 2 +- src_testbed/physx_backend.rs | 11 +++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) (limited to 'src_testbed') diff --git a/src_testbed/nphysics_backend.rs b/src_testbed/nphysics_backend.rs index b449c44..a2b0331 100644 --- a/src_testbed/nphysics_backend.rs +++ b/src_testbed/nphysics_backend.rs @@ -184,7 +184,8 @@ fn nphysics_collider_from_rapier_collider( } else if let Some(ball) = shape.as_ball() { ShapeHandle::new(Ball::new(ball.radius - margin)) } else if let Some(capsule) = shape.as_capsule() { - ShapeHandle::new(Capsule::new(capsule.half_height, capsule.radius)) + pos *= capsule.transform_wrt_y(); + ShapeHandle::new(Capsule::new(capsule.half_height(), capsule.radius)) } else if let Some(heightfield) = shape.as_heightfield() { ShapeHandle::new(heightfield.clone()) } else { diff --git a/src_testbed/objects/capsule.rs b/src_testbed/objects/capsule.rs index f285b81..23160be 100644 --- a/src_testbed/objects/capsule.rs +++ b/src_testbed/objects/capsule.rs @@ -19,7 +19,7 @@ impl Capsule { window: &mut window::Window, ) -> Capsule { let r = capsule.radius; - let h = capsule.half_height * 2.0; + let h = capsule.half_height() * 2.0; #[cfg(feature = "dim2")] let node = window.add_planar_capsule(r, h); #[cfg(feature = "dim3")] 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 { -- cgit