Hi Allen,
had the same problem, no there's no such functions in OpenSG (AFAIK). I
found some routines on the internet
http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToMa
trix/index.htm
Below two methods that do the matrix to euler axis rotation
and inverse.... You just have to pass from the quaternion to
the matrix which OpenSG already provides.
Cheers,
Toni
P.S.: All angles in degrees.
OSG::Matrix eulerToMatrix( double rotX, double rotY, double rotZ )
{
// ripped from
//http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerTo
Matrix/index.htm
double ch = cos(M_PI*rotX/180.0);
double sh = sin(M_PI*rotX/180.0);
double ca = cos(M_PI*rotY/180.0);
double sa = sin(M_PI*rotY/180.0);
double cb = cos(M_PI*rotZ/180.0);
double sb = sin(M_PI*rotZ/180.0);
Matrix rot;
rot[0][0] = ch * ca;
rot[0][1] = sh*sb - ch*sa*cb;
rot[0][2] = ch*sa*sb + sh*cb;
rot[1][0] = sa;
rot[1][1] = ca*cb;
rot[1][2] = -ca*sb;
rot[2][0] = -sh*ca;
rot[2][1] = sh*sa*cb + ch*sb;
rot[2][2] = -sh*sa*sb + ch*cb;
return rot;
}
void matrixToEuler( OSG::Matrix m, double &rotX, double &rotY, double &rotZ
)
{
Vec3f translation, scaleFactor, rotAxis;
Quaternion osgrotation, scaleOrientation;
// remove the scale part of the matrix,
// else the calculus below won't work correctly
m.getTransform( translation, osgrotation, scaleFactor,
scaleOrientation );
scaleFactor[0] = 1.0;
scaleFactor[1] = 1.0;
scaleFactor[2] = 1.0;
m.setTransform( translation, osgrotation, scaleFactor);
// ripped from
//http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerTo
Matrix/index.htm
if (m[1][0] > 0.99998) { // singularity at north pole
rotX = atan2(m[0][2],m[2][2]);
rotY = M_PI/2;
rotZ = 0;
}
else if (m[1][0] < -0.99998) { // singularity at south pole
rotX = atan2(m[0][2],m[2][2]);
rotY = -M_PI/2;
rotZ = 0;
}else{
rotX = atan2(-m[2][0],m[0][0]); // heading
rotZ = atan2(-m[1][2],m[1][1]); // bank
rotY = asin(m[1][0]); // attitude
}
rotX *= 180.0/M_PI;
rotY *= 180.0/M_PI;
rotZ *= 180.0/M_PI;
}
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:opensg-users-
> [EMAIL PROTECTED] On Behalf Of Allen Bierbaum
> Sent: Wednesday, September 27, 2006 6:27 PM
> To: opensg-users
> Subject: [Opensg-users] Getting axis rotations (eulers) from a Quaterion
>
> Is there any way in OpenSG to get rotations around the individual axes
> (euler angles) from a Quaternion? Does anyone have utility code to do
> it with an OpenSG quaternion?
>
> I have found a method to set a quaternion from this information
> (setValue(float,float,float)) but I don't see any routine to get the
> information back out in this form. (and yes I know there will be
> multiple possible ways to represent the values but I need a way to
> represent a rotation in a GUI and AFAIK rotations in degrees around the
> 3 axes are still the best way to do this)
>
> -Allen
>
>
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share
> your
> opinions on IT & business topics through brief surveys -- and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> Opensg-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/opensg-users
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Opensg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users