Browse Source

Fix Vector3 Slerp Normalizing Zero Vectors

Ported the existing zero length check in C++ into C#.
Z0rb14n 1 year ago
parent
commit
0d6e9de0b9
1 changed files with 9 additions and 1 deletions
  1. 9 1
      modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs

+ 9 - 1
modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs

@@ -692,10 +692,18 @@ namespace Godot
                 // Zero length vectors have no angle, so the best we can do is either lerp or throw an error.
                 // Zero length vectors have no angle, so the best we can do is either lerp or throw an error.
                 return Lerp(to, weight);
                 return Lerp(to, weight);
             }
             }
+            Vector3 axis = Cross(to);
+            real_t axisLengthSquared = axis.LengthSquared();
+            if (axisLengthSquared == 0.0)
+            {
+                // Colinear vectors have no rotation axis or angle between them, so the best we can do is lerp.
+                return Lerp(to, weight);
+            }
+            axis /= Mathf.Sqrt(axisLengthSquared);
             real_t startLength = Mathf.Sqrt(startLengthSquared);
             real_t startLength = Mathf.Sqrt(startLengthSquared);
             real_t resultLength = Mathf.Lerp(startLength, Mathf.Sqrt(endLengthSquared), weight);
             real_t resultLength = Mathf.Lerp(startLength, Mathf.Sqrt(endLengthSquared), weight);
             real_t angle = AngleTo(to);
             real_t angle = AngleTo(to);
-            return Rotated(Cross(to).Normalized(), angle * weight) * (resultLength / startLength);
+            return Rotated(axis, angle * weight) * (resultLength / startLength);
         }
         }
 
 
         /// <summary>
         /// <summary>