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