Browse Source

#2284 Double check the collision really has happened in world space (#2285)

(otherwise glancing blows can end up "happening" but at infinite distance due to numerical precision)
richardTingle 1 year ago
parent
commit
e2e9a94f08
1 changed files with 14 additions and 9 deletions
  1. 14 9
      jme3-core/src/main/java/com/jme3/collision/bih/BIHNode.java

+ 14 - 9
jme3-core/src/main/java/com/jme3/collision/bih/BIHNode.java

@@ -411,15 +411,20 @@ public final class BIHNode implements Savable {
                         t = t_world;
                     }
 
-                    Vector3f contactNormal = Triangle.computeTriangleNormal(v1, v2, v3, null);
-                    Vector3f contactPoint = new Vector3f(d).multLocal(t).addLocal(o);
-                    float worldSpaceDist = o.distance(contactPoint);
-
-                    CollisionResult cr = new CollisionResult(contactPoint, worldSpaceDist);
-                    cr.setContactNormal(contactNormal);
-                    cr.setTriangleIndex(tree.getTriangleIndex(i));
-                    results.addCollision(cr);
-                    cols++;
+                    // this second isInfinite test is unlikely to fail but due to numeric precision it might
+                    // be the case that in local coordinates it just hits and in world coordinates it just misses
+                    // this filters those cases out (treating them as misses).
+                    if (!Float.isInfinite(t)){
+                        Vector3f contactNormal = Triangle.computeTriangleNormal(v1, v2, v3, null);
+                        Vector3f contactPoint = new Vector3f(d).multLocal(t).addLocal(o);
+                        float worldSpaceDist = o.distance(contactPoint);
+
+                        CollisionResult cr = new CollisionResult(contactPoint, worldSpaceDist);
+                        cr.setContactNormal(contactNormal);
+                        cr.setTriangleIndex(tree.getTriangleIndex(i));
+                        results.addCollision(cr);
+                        cols++;
+                    }
                 }
             }
         }