diff options
| author | Crozet Sébastien <developer@crozet.re> | 2020-11-11 17:18:10 +0100 |
|---|---|---|
| committer | Crozet Sébastien <developer@crozet.re> | 2020-11-11 17:18:10 +0100 |
| commit | 17614116da30b2dbe80d33e1a32c76f93c485fe9 (patch) | |
| tree | fa087fb3fce4d28f62b8443e2b44c59c2302899d | |
| parent | 2102aeb4229a51afc1e050ca8d999e87230adbc0 (diff) | |
| download | rapier-17614116da30b2dbe80d33e1a32c76f93c485fe9.tar.gz rapier-17614116da30b2dbe80d33e1a32c76f93c485fe9.tar.bz2 rapier-17614116da30b2dbe80d33e1a32c76f93c485fe9.zip | |
Fix NaN when two balls are in contact and their centers coincide.
| -rw-r--r-- | src/geometry/contact_generator/ball_ball_contact_generator.rs | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/geometry/contact_generator/ball_ball_contact_generator.rs b/src/geometry/contact_generator/ball_ball_contact_generator.rs index 4889aaf..96ac235 100644 --- a/src/geometry/contact_generator/ball_ball_contact_generator.rs +++ b/src/geometry/contact_generator/ball_ball_contact_generator.rs @@ -1,6 +1,6 @@ use crate::geometry::contact_generator::PrimitiveContactGenerationContext; use crate::geometry::{Contact, KinematicsCategory}; -use crate::math::Point; +use crate::math::{Point, Vector}; #[cfg(feature = "simd-is-enabled")] use { crate::geometry::contact_generator::PrimitiveContactGenerationContextSimd, @@ -72,7 +72,12 @@ pub fn generate_contacts_ball_ball(ctxt: &mut PrimitiveContactGenerationContext) let dist = center_dist - radius_a - radius_b; if dist < ctxt.prediction_distance { - let local_n1 = dcenter / center_dist; + let local_n1 = if center_dist != 0.0 { + dcenter / center_dist + } else { + Vector::y() + }; + let local_n2 = pos_ba.inverse_transform_vector(&-local_n1); let local_p1 = local_n1 * radius_a; let local_p2 = local_n2 * radius_b; |
