From 6c743a89b93502ae035c7aa4061f6461520f756f Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 13 May 2013 12:52:39 +0200 Subject: [PATCH] Added Quaternion::(Make)RotationBetween Former-commit-id: e28517580bd17970e77a38f54e7c114cdaf402d5 --- include/Nazara/Math/Quaternion.hpp | 2 ++ include/Nazara/Math/Quaternion.inl | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/Nazara/Math/Quaternion.hpp b/include/Nazara/Math/Quaternion.hpp index 1702ab225..2d32d1b92 100644 --- a/include/Nazara/Math/Quaternion.hpp +++ b/include/Nazara/Math/Quaternion.hpp @@ -37,6 +37,7 @@ template class NzQuaternion NzQuaternion& Inverse(); NzQuaternion& MakeIdentity(); + NzQuaternion& MakeRotationBetween(const NzVector3& from, const NzVector3& to); NzQuaternion& MakeZero(); T Magnitude() const; @@ -75,6 +76,7 @@ template class NzQuaternion static NzQuaternion Identity(); static NzQuaternion Lerp(const NzQuaternion& from, const NzQuaternion& to, T interpolation); + static NzQuaternion RotationBetween(const NzVector3& from, const NzVector3& to); static NzQuaternion Slerp(const NzQuaternion& from, const NzQuaternion& to, T interpolation); static NzQuaternion Zero(); diff --git a/include/Nazara/Math/Quaternion.inl b/include/Nazara/Math/Quaternion.inl index c314690f4..4432eee21 100644 --- a/include/Nazara/Math/Quaternion.inl +++ b/include/Nazara/Math/Quaternion.inl @@ -129,6 +129,18 @@ NzQuaternion& NzQuaternion::MakeIdentity() return Set(F(1.0), F(0.0), F(0.0), F(0.0)); } +template +NzQuaternion& NzQuaternion::MakeRotationBetween(const NzVector3& from, const NzVector3& to) +{ + NzVector3f a = from.CrossProduct(to); + x = a.x; + y = a.y; + z = a.z; + w = std::sqrt(std::pow(from.GetLength(), 2.f) * std::pow(to.GetLength(), 2.f)) + from.DotProduct(to); + + return Normalize(); +} + template NzQuaternion& NzQuaternion::MakeZero() { @@ -382,6 +394,15 @@ NzQuaternion NzQuaternion::Lerp(const NzQuaternion& from, const NzQuaterni return interpolated; } +template +NzQuaternion NzQuaternion::RotationBetween(const NzVector3& from, const NzVector3& to) +{ + NzQuaternion quaternion; + quaternion.MakeRotationBetween(from, to); + + return quaternion; +} + template NzQuaternion NzQuaternion::Slerp(const NzQuaternion& from, const NzQuaternion& to, T interpolation) {