From 6901159106d56b8cada1f85e1e9a6e8f74672beb Mon Sep 17 00:00:00 2001 From: Syntriax Date: Sun, 19 Oct 2025 00:16:07 +0300 Subject: [PATCH] fix: Quaternion.RotateVector method not working properly on some angles fixed --- Engine.Core/Primitives/Quaternion.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Engine.Core/Primitives/Quaternion.cs b/Engine.Core/Primitives/Quaternion.cs index 23e9ed7..c18ab6d 100644 --- a/Engine.Core/Primitives/Quaternion.cs +++ b/Engine.Core/Primitives/Quaternion.cs @@ -187,8 +187,12 @@ public readonly struct Quaternion(float x, float y, float z, float w) : IEquatab /// The rotated . public static Vector3D RotateVector(Vector3D vector, Quaternion quaternion) { - Quaternion rotation = quaternion * new Quaternion(vector.X, vector.Y, vector.Z, 0) * Invert(quaternion); - return new(rotation.X, rotation.Y, rotation.Z); + // https://blog.molecular-matters.com/2013/05/24/a-faster-quaternion-vector-multiplication/ + // t = 2 * cross(q.xyz, v) + // v' = v + q.w * t + cross(q.xyz, t) + Vector3D quaternionVector = new(quaternion.X, quaternion.Y, quaternion.Z); + Vector3D t = 2f * quaternionVector.Cross(vector); + return vector + quaternion.W * t + quaternionVector.Cross(t); } ///