added quaternion::toAngleAxis

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@645 dfc29bdd-3216-0410-991c-e03cc46cb475
master
bitplane 2007-05-21 00:35:31 +00:00
parent c00ce1d372
commit 41a9bf794a
1 changed files with 23 additions and 0 deletions

View File

@ -93,6 +93,9 @@ class quaternion
//! q = cos(A/2)+sin(A/2)*(x*i+y*j+z*k)
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;
//! set quaternion to identity
@ -465,6 +468,26 @@ inline void quaternion::fromAngleAxis(f32 angle, const vector3df& axis)
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
{
double sqw = W*W;