From e1cf41b94bcd30af56348befa7c06852d8474a6f Mon Sep 17 00:00:00 2001 From: Zode Date: Wed, 17 Jul 2024 01:12:17 +0300 Subject: [PATCH] Fix Quaternion.FromDirection giving bogus output when fed a perfect down vector --- Source/Engine/Core/Math/Quaternion.cpp | 4 ++++ Source/Engine/Core/Math/Quaternion.cs | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/Source/Engine/Core/Math/Quaternion.cpp b/Source/Engine/Core/Math/Quaternion.cpp index 03989dab5..5927e0665 100644 --- a/Source/Engine/Core/Math/Quaternion.cpp +++ b/Source/Engine/Core/Math/Quaternion.cpp @@ -294,6 +294,10 @@ Quaternion Quaternion::FromDirection(const Float3& direction) { RotationAxis(Float3::Left, PI_OVER_2, orientation); } + else if (Float3::Dot(direction, Float3::Down) >= 0.999f) + { + RotationAxis(Float3::Right, PI_OVER_2, orientation); + } else { Float3 right, up; diff --git a/Source/Engine/Core/Math/Quaternion.cs b/Source/Engine/Core/Math/Quaternion.cs index 86a6e4e2d..d4d0fe96c 100644 --- a/Source/Engine/Core/Math/Quaternion.cs +++ b/Source/Engine/Core/Math/Quaternion.cs @@ -654,6 +654,10 @@ namespace FlaxEngine { orientation = RotationAxis(Float3.Left, Mathf.PiOverTwo); } + else if (Float3.Dot(direction, Float3.Down) >= 0.999f) + { + orientation = RotationAxis(Float3.Right, Mathf.PiOverTwo); + } else { var right = Float3.Cross(direction, Float3.Up);