normalize toAngleAxis result
This commit is contained in:
parent
4385befa11
commit
64ca76830c
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user