Selaa lähdekoodia

Fallback when crossproduct in Quaternion::FromLookRotation() becomes zero. Fixes #846.

Lasse Öörni 10 vuotta sitten
vanhempi
sitoutus
0f0a73c9f6
1 muutettua tiedostoa jossa 12 lisäystä ja 5 poistoa
  1. 12 5
      Source/Urho3D/Math/Quaternion.cpp

+ 12 - 5
Source/Urho3D/Math/Quaternion.cpp

@@ -150,13 +150,20 @@ void Quaternion::FromRotationMatrix(const Matrix3& matrix)
 
 
 bool Quaternion::FromLookRotation(const Vector3& direction, const Vector3& upDirection)
 bool Quaternion::FromLookRotation(const Vector3& direction, const Vector3& upDirection)
 {
 {
+    Quaternion ret;
     Vector3 forward = direction.Normalized();
     Vector3 forward = direction.Normalized();
-    Vector3 v = forward.CrossProduct(upDirection).Normalized();
-    Vector3 up = v.CrossProduct(forward);
-    Vector3 right = up.CrossProduct(forward);
 
 
-    Quaternion ret;
-    ret.FromAxes(right, up, forward);
+    Vector3 v = forward.CrossProduct(upDirection);
+    // If direction & upDirection are parallel and crossproduct becomes zero, use FromRotationTo() fallback
+    if (v.LengthSquared() >= M_EPSILON)
+    {
+        v.Normalize();
+        Vector3 up = v.CrossProduct(forward);
+        Vector3 right = up.CrossProduct(forward);
+        ret.FromAxes(right, up, forward);
+    }
+    else
+        ret.FromRotationTo(Vector3::FORWARD, forward);
 
 
     if (!ret.IsNaN())
     if (!ret.IsNaN())
     {
     {