Commit 41a9bf79 authored by bitplane's avatar bitplane

added quaternion::toAngleAxis

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@645 dfc29bdd-3216-0410-991c-e03cc46cb475
parent c00ce1d3
...@@ -93,6 +93,9 @@ class quaternion ...@@ -93,6 +93,9 @@ class quaternion
//! q = cos(A/2)+sin(A/2)*(x*i+y*j+z*k) //! q = cos(A/2)+sin(A/2)*(x*i+y*j+z*k)
void fromAngleAxis (f32 angle, const vector3df& axis); void fromAngleAxis (f32 angle, const vector3df& axis);
//! Fills an angle (radians) around an axis (unit vector)
void toAngleAxis (f32 &angle, vector3df& axis) const;
void toEuler(vector3df& euler) const; void toEuler(vector3df& euler) const;
//! set quaternion to identity //! set quaternion to identity
...@@ -465,6 +468,26 @@ inline void quaternion::fromAngleAxis(f32 angle, const vector3df& axis) ...@@ -465,6 +468,26 @@ inline void quaternion::fromAngleAxis(f32 angle, const vector3df& axis)
Z = fSin*axis.Z; Z = fSin*axis.Z;
} }
inline void quaternion::toAngleAxis(f32 &angle, core::vector3df &axis) const
{
f32 scale = sqrt (X*X + Y*Y + Z*Z);
if (core::equals(scale,0.0f) || W > 1.0f)
{
angle = 0.0f;
axis.X = 0.0f;
axis.Y = 1.0f;
axis.Z = 0.0f;
}
else
{
angle = 2.0f * acos(W);
axis.X = X / scale;
axis.Y = Y / scale;
axis.Z = Z / scale;
}
}
inline void quaternion::toEuler(vector3df& euler) const inline void quaternion::toEuler(vector3df& euler) const
{ {
double sqw = W*W; double sqw = W*W;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment