diff options
author | Z0rb14n <babybluewoof@gmail.com> | 2024-07-25 18:40:29 -0700 |
---|---|---|
committer | Z0rb14n <babybluewoof@gmail.com> | 2024-07-26 09:04:54 -0700 |
commit | 0d6e9de0b904aa5acdfcc56607a3aded431c2f6c (patch) | |
tree | 6d2907b149ad76395ff0dfc501e4e52bed3936b1 | |
parent | e343dbbcc1030f04dc5833f1c19d267a17332ca9 (diff) | |
download | redot-engine-0d6e9de0b904aa5acdfcc56607a3aded431c2f6c.tar.gz |
Fix Vector3 Slerp Normalizing Zero Vectors
Ported the existing zero length check in C++ into C#.
-rw-r--r-- | modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs index 27f2713efa..ef66d5bbe0 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs +++ b/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. 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 resultLength = Mathf.Lerp(startLength, Mathf.Sqrt(endLengthSquared), weight); real_t angle = AngleTo(to); - return Rotated(Cross(to).Normalized(), angle * weight) * (resultLength / startLength); + return Rotated(axis, angle * weight) * (resultLength / startLength); } /// <summary> |