normalize toAngleAxis result

This commit is contained in:
Pascal Serrarens 2024-04-26 12:12:22 +02:00
parent 4385befa11
commit 64ca76830c

View File

@ -3,9 +3,9 @@
// file, You can obtain one at https ://mozilla.org/MPL/2.0/. // file, You can obtain one at https ://mozilla.org/MPL/2.0/.
#include "Quaternion.h" #include "Quaternion.h"
#include "Vector3.h"
#include <float.h> #include <float.h>
#include <math.h> #include <math.h>
#include "Vector3.h"
void CopyQuat(const Quat &q1, Quat &q2) { void CopyQuat(const Quat &q1, Quat &q2) {
q2.x = q1.x; q2.x = q1.x;
@ -42,9 +42,7 @@ Quaternion::~Quaternion() {}
const Quaternion Quaternion::identity = Quaternion(0, 0, 0, 1); const Quaternion Quaternion::identity = Quaternion(0, 0, 0, 1);
Vector3 Quaternion::xyz() const { Vector3 Quaternion::xyz() const { return Vector3(x, y, z); }
return Vector3(x, y, z);
}
float Quaternion::GetLength() const { float Quaternion::GetLength() const {
return sqrtf(x * x + y * y + z * z + w * w); return sqrtf(x * x + y * y + z * z + w * w);
@ -239,22 +237,20 @@ void Quaternion::ToAngleAxis(float* angle, Vector3* axis) {
*angle *= Rad2Deg; *angle *= Rad2Deg;
} }
void Quaternion::ToAxisAngleRad(const Quaternion& q, void Quaternion::ToAxisAngleRad(const Quaternion &q, Vector3 *const axis,
Vector3* const axis,
float *angle) { float *angle) {
Quaternion q1 = (fabs(q.w) > 1.0f) ? Quaternion::Normalize(q) : q; Quaternion q1 = (fabs(q.w) > 1.0f) ? Quaternion::Normalize(q) : q;
*angle = 2.0f * acosf(q1.w); // angle *angle = 2.0f * acosf(q1.w); // angle
float den = sqrtf(1.0F - q1.w * q1.w); float den = sqrtf(1.0F - q1.w * q1.w);
if (den > 0.0001f) { if (den > 0.0001f) {
*axis = q1.xyz() / den; *axis = Vector3::Normalize(q1.xyz() / den);
} else { } else {
// This occurs when the angle is zero. // This occurs when the angle is zero.
// Not a problem: just set an arbitrary normalized axis. // Not a problem: just set an arbitrary normalized axis.
*axis = Vector3(1, 0, 0); *axis = Vector3(1, 0, 0);
} }
} }
Quaternion Quaternion::SlerpUnclamped(const Quaternion& a, Quaternion Quaternion::SlerpUnclamped(const Quaternion &a, const Quaternion &b,
const Quaternion& b,
float t) { float t) {
// if either input is zero, return the other. // if either input is zero, return the other.
if (Quaternion::GetLengthSquared(a) == 0.0f) { if (Quaternion::GetLengthSquared(a) == 0.0f) {
@ -304,8 +300,7 @@ Quaternion Quaternion::SlerpUnclamped(const Quaternion& a,
return Quaternion(); return Quaternion();
} }
Quaternion Quaternion::Slerp(const Quaternion& a, Quaternion Quaternion::Slerp(const Quaternion &a, const Quaternion &b,
const Quaternion& b,
float t) { float t) {
if (t > 1) if (t > 1)
t = 1; t = 1;
@ -399,10 +394,8 @@ Quaternion Quaternion::GetRotationAround(Vector3 axis, Quaternion rotation) {
return twist; return twist;
} }
void Quaternion::GetSwingTwist(Vector3 axis, void Quaternion::GetSwingTwist(Vector3 axis, Quaternion rotation,
Quaternion rotation, Quaternion *swing, Quaternion *twist) {
Quaternion* swing,
Quaternion* twist) {
*twist = GetRotationAround(axis, rotation); *twist = GetRotationAround(axis, rotation);
*swing = rotation * Quaternion::Inverse(*twist); *swing = rotation * Quaternion::Inverse(*twist);
} }