diff --git a/src/navigation/pathcurves/avoidcollisioncurve.cpp b/src/navigation/pathcurves/avoidcollisioncurve.cpp index 9cb1195110..ec546e7e33 100644 --- a/src/navigation/pathcurves/avoidcollisioncurve.cpp +++ b/src/navigation/pathcurves/avoidcollisioncurve.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -152,8 +153,11 @@ void AvoidCollisionCurve::removeCollisions(int step) { glm::dvec3 p1 = glm::inverse(modelTransform) * glm::dvec4(lineStart, 1.0); glm::dvec3 p2 = glm::inverse(modelTransform) * glm::dvec4(lineEnd, 1.0); - // Sphere to check for collision - double radius = node->boundingSphere(); + // Sphere to check for collision. Make sure it does not have radius zero. + const double minValidBoundingSphere = + global::navigationHandler->pathNavigator().minValidBoundingSphere(); + + double radius = std::max(node->boundingSphere(), minValidBoundingSphere); glm::dvec3 center = glm::dvec3(0.0, 0.0, 0.0); // Add a buffer to avoid passing too close to the node. @@ -208,6 +212,13 @@ void AvoidCollisionCurve::removeCollisions(int step) { glm::dvec3 extraKnot = collisionPoint - avoidCollisionDistance * glm::normalize(orthogonal); + // Don't add invalid positions (indicating precision issues) + if (glm::any(glm::isnan(extraKnot))) { + throw InsufficientPrecisionError( + "Insufficient precision for avoid collision computation" + ); + } + _points.insert(_points.begin() + i + 2, extraKnot); step++; diff --git a/src/util/collisionhelper.cpp b/src/util/collisionhelper.cpp index 10b1f83de2..4ba8748024 100644 --- a/src/util/collisionhelper.cpp +++ b/src/util/collisionhelper.cpp @@ -24,6 +24,8 @@ #include +#include + namespace openspace::collision { // Source: http://paulbourke.net/geometry/circlesphere/raysphere.c