00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef OPAL_QUATERNION_H
00029 #define OPAL_QUATERNION_H
00030
00031
00032 #include "OpalMath.h"
00033 #include "Portability.h"
00034
00035
00036 #include <iostream>
00037
00038 namespace opal
00039 {
00040 class Vec3r;
00041
00042 class Quaternion
00043 {
00044 public:
00045 real w;
00046 real x;
00047 real y;
00048 real z;
00049
00050 OPAL_DECL Quaternion();
00051
00052 OPAL_DECL Quaternion( real ww, real xx, real yy, real zz );
00053
00054 OPAL_DECL Quaternion( const Quaternion& src );
00055
00056 OPAL_DECL void OPAL_CALL set( real ww, real xx, real yy, real zz );
00057
00058 OPAL_DECL real OPAL_CALL lengthSquared() const;
00059
00060 OPAL_DECL real OPAL_CALL length() const;
00061
00063 OPAL_DECL void OPAL_CALL normalize();
00064
00066
00072 OPAL_DECL void OPAL_CALL getAngleAxis( real & angle, Vec3r & axis ) const;
00073
00074 OPAL_DECL real OPAL_CALL getRoll() const;
00075
00076 OPAL_DECL real OPAL_CALL getPitch() const;
00077
00078 OPAL_DECL real OPAL_CALL getYaw() const;
00079
00080 OPAL_DECL real & OPAL_CALL operator[] ( unsigned int i );
00081
00082 OPAL_DECL const real & OPAL_CALL operator[] ( unsigned int i ) const;
00083 };
00084
00085 OPAL_DECL Quaternion operator+( const Quaternion &q1, const Quaternion &q2 );
00086 OPAL_DECL Quaternion operator-( const Quaternion &q1, const Quaternion &q2 );
00087 OPAL_DECL Quaternion operator*( const Quaternion& q, real scalar );
00088 OPAL_DECL Quaternion operator*( real scalar, const Quaternion& q );
00089 OPAL_DECL bool operator==( const Quaternion &q1, const Quaternion &q2 );
00090 OPAL_DECL bool operator!=( const Quaternion &q1, const Quaternion &q2 );
00091
00093 OPAL_DECL std::ostream & operator<<( std::ostream& o, const Quaternion& q );
00094
00095 }
00096
00097 #endif