[Opal-commits] opal/src Quaternion.cpp,NONE,1.1 Makefile.am,1.6,1.7 Makefile.in,1.6,1.7 Matrix44r.h,
Status: Inactive
Brought to you by:
tylerstreeter
|
From: Olex <ole...@us...> - 2005-12-01 19:34:27
|
Update of /cvsroot/opal/opal/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19201/src Modified Files: Makefile.am Makefile.in Matrix44r.h Quaternion.h testQuaternion.cpp testsolid.cpp Added Files: Quaternion.cpp Log Message: Fixed Matrix44r::setQuaternion(). Refactored Quaternion. More unit tests. Index: Makefile.in =================================================================== RCS file: /cvsroot/opal/opal/src/Makefile.in,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** Makefile.in 1 Dec 2005 04:54:44 -0000 1.6 --- Makefile.in 1 Dec 2005 19:34:03 -0000 1.7 *************** *** 62,66 **** ServoMotor.$(OBJEXT) Simulator.$(OBJEXT) Solid.$(OBJEXT) \ SolidData.$(OBJEXT) Space.$(OBJEXT) SpringMotor.$(OBJEXT) \ ! ThrusterMotor.$(OBJEXT) VolumeSensor.$(OBJEXT) Vec3r.$(OBJEXT) libopalode_a_OBJECTS = $(am_libopalode_a_OBJECTS) am__installdirs = "$(DESTDIR)$(bindir)" --- 62,67 ---- ServoMotor.$(OBJEXT) Simulator.$(OBJEXT) Solid.$(OBJEXT) \ SolidData.$(OBJEXT) Space.$(OBJEXT) SpringMotor.$(OBJEXT) \ ! ThrusterMotor.$(OBJEXT) VolumeSensor.$(OBJEXT) Vec3r.$(OBJEXT) \ ! Quaternion.$(OBJEXT) libopalode_a_OBJECTS = $(am_libopalode_a_OBJECTS) am__installdirs = "$(DESTDIR)$(bindir)" *************** *** 206,213 **** noinst_LIBRARIES = libopalode.a libopalode_a_SOURCES = AccelerationSensor.cpp AttractorMotor.cpp Blueprint.cpp \ ! BlueprintInstance.cpp BlueprintManager.cpp CollisionEventHandler.cpp GearedMotor.cpp \ ! InclineSensor.cpp Joint.cpp Logger.cpp Motor.cpp RaycastSensor.cpp Sensor.cpp \ ! ServoMotor.cpp Simulator.cpp Solid.cpp SolidData.cpp Space.cpp SpringMotor.cpp \ ! ThrusterMotor.cpp VolumeSensor.cpp Vec3r.cpp test_opal_SOURCES = testopal.cpp testsolid.cpp testAccelerationSensor.cpp \ --- 207,214 ---- noinst_LIBRARIES = libopalode.a libopalode_a_SOURCES = AccelerationSensor.cpp AttractorMotor.cpp Blueprint.cpp \ ! BlueprintInstance.cpp BlueprintManager.cpp CollisionEventHandler.cpp GearedMotor.cpp \ ! InclineSensor.cpp Joint.cpp Logger.cpp Motor.cpp RaycastSensor.cpp Sensor.cpp \ ! ServoMotor.cpp Simulator.cpp Solid.cpp SolidData.cpp Space.cpp SpringMotor.cpp \ ! ThrusterMotor.cpp VolumeSensor.cpp Vec3r.cpp Quaternion.cpp test_opal_SOURCES = testopal.cpp testsolid.cpp testAccelerationSensor.cpp \ *************** *** 307,310 **** --- 308,312 ---- @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Logger.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Motor.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Quaternion.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RaycastSensor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Sensor.Po@am__quote@ Index: testQuaternion.cpp =================================================================== RCS file: /cvsroot/opal/opal/src/testQuaternion.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** testQuaternion.cpp 1 Dec 2005 04:54:44 -0000 1.1 --- testQuaternion.cpp 1 Dec 2005 19:34:03 -0000 1.2 *************** *** 55,72 **** } QT_TEST( operator_equal ) { QT_CHECK_EQUAL( Quaternion( 0, 0, 0, 0 ), Quaternion( 0, 0, 0, 0 ) ); ! QT_CHECK_EQUAL( Quaternion( 0, 0, 0, 1 ), Quaternion( 0, 0, 0, 1 ) ); ! QT_CHECK_EQUAL( Quaternion( 0, 0, 1, 2 ), Quaternion( 0, 0, 1, 2 ) ); ! QT_CHECK_EQUAL( Quaternion( 1, 2, 0, 3 ), Quaternion( 1, 2, 0, 3 ) ); } ! QT_TEST( operator_not_equal ) ! { ! QT_CHECK_NOT_EQUAL( Quaternion( 0, 0, 0, 0 ), Quaternion( 1, 0, 0, 0 ) ); ! QT_CHECK_NOT_EQUAL( Quaternion( 0, 0, 0, 1 ), Quaternion( 0, 1, 0, 0 ) ); ! QT_CHECK_NOT_EQUAL( Quaternion( 0, 0, 1, 2 ), Quaternion( 4, 5, 0, 2 ) ); ! QT_CHECK_NOT_EQUAL( Quaternion( 1, 2, 0, 3 ), Quaternion( 1, 0, 2, 3 ) ); ! } } --- 55,125 ---- } + QT_TEST( set ) + { + Quaternion q; + q.set( 1, 2, 3, 4 ); + QT_CHECK_EQUAL( q[ 0 ], 1 ); + QT_CHECK_EQUAL( q[ 1 ], 2 ); + QT_CHECK_EQUAL( q[ 2 ], 3 ); + QT_CHECK_EQUAL( q[ 3 ], 4 ); + } + + QT_TEST( operator_square_brackets ) + { + Quaternion q( 1, 2, 3, 4 ); + QT_CHECK_EQUAL( q[ 0 ], 1 ); + QT_CHECK_EQUAL( q[ 1 ], 2 ); + QT_CHECK_EQUAL( q[ 2 ], 3 ); + QT_CHECK_EQUAL( q[ 3 ], 4 ); + } + + QT_TEST( copy_constructor ) + { + Quaternion q( Quaternion( 1, 2, 3, 4 ) ); + QT_CHECK_EQUAL( q[ 0 ], 1 ); + QT_CHECK_EQUAL( q[ 1 ], 2 ); + QT_CHECK_EQUAL( q[ 2 ], 3 ); + QT_CHECK_EQUAL( q[ 3 ], 4 ); + } + QT_TEST( operator_equal ) { QT_CHECK_EQUAL( Quaternion( 0, 0, 0, 0 ), Quaternion( 0, 0, 0, 0 ) ); ! QT_CHECK_EQUAL( Quaternion( 0, 0, 0, 1 ), Quaternion( 0, 0, 0, 1 ) ); ! QT_CHECK_EQUAL( Quaternion( 0, 0, 1, 2 ), Quaternion( 0, 0, 1, 2 ) ); ! QT_CHECK_EQUAL( Quaternion( 1, 2, 0, 3 ), Quaternion( 1, 2, 0, 3 ) ); } ! QT_TEST( operator_not_equal ) ! { ! QT_CHECK_NOT_EQUAL( Quaternion( 0, 0, 0, 0 ), Quaternion( 1, 0, 0, 0 ) ); ! QT_CHECK_NOT_EQUAL( Quaternion( 0, 0, 0, 1 ), Quaternion( 0, 1, 0, 0 ) ); ! QT_CHECK_NOT_EQUAL( Quaternion( 0, 0, 1, 2 ), Quaternion( 4, 5, 0, 2 ) ); ! QT_CHECK_NOT_EQUAL( Quaternion( 1, 2, 0, 3 ), Quaternion( 1, 0, 2, 3 ) ); ! } ! ! QT_TEST( lengthSquared ) ! { ! QT_CHECK_CLOSE( Quaternion( 0, 0, 0, 0 ).lengthSquared(), 0, 0.001 ); ! QT_CHECK_CLOSE( Quaternion( 1, 0, 0, 0 ).lengthSquared(), 1, 0.001 ); ! QT_CHECK_CLOSE( Quaternion( 1, 2, 0, 0 ).lengthSquared(), 5, 0.001 ); ! QT_CHECK_CLOSE( Quaternion( 1, 2, 3, 0 ).lengthSquared(), 14, 0.001 ); ! QT_CHECK_CLOSE( Quaternion( 1, 2, 3, 4 ).lengthSquared(), 30, 0.001 ); ! } ! ! QT_TEST( length ) ! { ! QT_CHECK_CLOSE( Quaternion( 0, 0, 0, 0 ).length(), 0, 0.001 ); ! QT_CHECK_CLOSE( Quaternion( 1, 0, 0, 0 ).length(), 1, 0.001 ); ! QT_CHECK_CLOSE( Quaternion( 1, 2, 0, 0 ).length(), sqrt( 5 ), 0.001 ); ! QT_CHECK_CLOSE( Quaternion( 1, 2, 3, 0 ).length(), sqrt( 14 ), 0.001 ); ! QT_CHECK_CLOSE( Quaternion( 1, 2, 3, 4 ).length(), sqrt( 30 ), 0.001 ); ! } ! ! QT_TEST( normalize ) ! { ! Quaternion q( 0, 0, 0, 0 ); ! q.normalize(); ! QT_CHECK_NOT_EQUAL( q, Quaternion( 0, 0, 0, 0 ) ); ! } } Index: testsolid.cpp =================================================================== RCS file: /cvsroot/opal/opal/src/testsolid.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** testsolid.cpp 1 Dec 2005 04:54:44 -0000 1.5 --- testsolid.cpp 1 Dec 2005 19:34:03 -0000 1.6 *************** *** 234,237 **** --- 234,241 ---- f.s->setQuaternion( q ); QT_CHECK_EQUAL( q, f.s->getQuaternion() ); + + q.set( 0, 0, 0, 1 ); + f.s->setQuaternion( q ); + QT_CHECK_EQUAL( q, f.s->getQuaternion() ); } } Index: Makefile.am =================================================================== RCS file: /cvsroot/opal/opal/src/Makefile.am,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** Makefile.am 1 Dec 2005 04:54:44 -0000 1.6 --- Makefile.am 1 Dec 2005 19:34:03 -0000 1.7 *************** *** 9,16 **** noinst_LIBRARIES = libopalode.a libopalode_a_SOURCES = AccelerationSensor.cpp AttractorMotor.cpp Blueprint.cpp \ ! BlueprintInstance.cpp BlueprintManager.cpp CollisionEventHandler.cpp GearedMotor.cpp \ ! InclineSensor.cpp Joint.cpp Logger.cpp Motor.cpp RaycastSensor.cpp Sensor.cpp \ ! ServoMotor.cpp Simulator.cpp Solid.cpp SolidData.cpp Space.cpp SpringMotor.cpp \ ! ThrusterMotor.cpp VolumeSensor.cpp Vec3r.cpp bin_PROGRAMS = test_opal test_opal_SOURCES = testopal.cpp testsolid.cpp testAccelerationSensor.cpp \ --- 9,16 ---- noinst_LIBRARIES = libopalode.a libopalode_a_SOURCES = AccelerationSensor.cpp AttractorMotor.cpp Blueprint.cpp \ ! BlueprintInstance.cpp BlueprintManager.cpp CollisionEventHandler.cpp GearedMotor.cpp \ ! InclineSensor.cpp Joint.cpp Logger.cpp Motor.cpp RaycastSensor.cpp Sensor.cpp \ ! ServoMotor.cpp Simulator.cpp Solid.cpp SolidData.cpp Space.cpp SpringMotor.cpp \ ! ThrusterMotor.cpp VolumeSensor.cpp Vec3r.cpp Quaternion.cpp bin_PROGRAMS = test_opal test_opal_SOURCES = testopal.cpp testsolid.cpp testAccelerationSensor.cpp \ Index: Quaternion.h =================================================================== RCS file: /cvsroot/opal/opal/src/Quaternion.h,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** Quaternion.h 1 Dec 2005 04:54:44 -0000 1.10 --- Quaternion.h 1 Dec 2005 19:34:03 -0000 1.11 *************** *** 32,206 **** #include "OpalMath.h" namespace opal { ! class Quaternion; ! inline Quaternion operator+( const Quaternion &q1, const Quaternion &q2 ); ! inline Quaternion operator-( const Quaternion &q1, const Quaternion &q2 ); ! inline Quaternion operator*( const Quaternion& q, real scalar ); ! inline Quaternion operator*( real scalar, const Quaternion& q ); ! inline bool operator==( const Quaternion &q1, const Quaternion &q2 ); ! inline bool operator!=( const Quaternion &q1, const Quaternion &q2 ); ! ! /// Prints the Quaternion to the given output stream. ! inline std::ostream& operator<<( std::ostream& o, const Quaternion& q ); ! class Quaternion { - private: - real mData[ 4 ]; - public: ! Quaternion() ! { ! mData[ 0 ] = 0; ! mData[ 1 ] = 0; ! mData[ 2 ] = 0; ! mData[ 3 ] = 0; ! } ! ! Quaternion( real w, real x, real y, real z ) ! { ! mData[ 0 ] = w; ! mData[ 1 ] = x; ! mData[ 2 ] = y; ! mData[ 3 ] = z; ! } ! Quaternion( const Quaternion& src ) ! { ! memcpy( mData, src.mData, 4 * sizeof( real ) ); ! } ! inline void set( real w, real x, real y, real z ) ! { ! mData[ 0 ] = w; ! mData[ 1 ] = x; ! mData[ 2 ] = y; ! mData[ 3 ] = z; ! } ! inline real lengthSquared() const ! { ! return mData[ 0 ] * mData[ 0 ] + mData[ 1 ] * mData[ 1 ] + mData[ 2 ] * mData[ 2 ] + ! mData[ 3 ] * mData[ 3 ]; ! } ! inline real length() const ! { ! return sqrt( lengthSquared() ); ! } ! inline void normalize() ! { ! real len = length(); ! assert( 0 != len ); ! real factor = 1 / len; ! ( *this ) = ( *this ) * factor; ! } ! void getAngleAxis( real& angle, Vec3r& axis ) ! { ! real sqrLen = mData[ 1 ] * mData[ 1 ] + mData[ 2 ] * mData[ 2 ] + ! mData[ 3 ] * mData[ 3 ]; ! if ( sqrLen > 0 ) ! { ! angle = 2 * acos( mData[ 0 ] ); ! real invLen = 1 / sqrt( sqrLen ); ! axis[ 0 ] = mData[ 1 ] * invLen; ! axis[ 1 ] = mData[ 2 ] * invLen; ! axis[ 2 ] = mData[ 3 ] * invLen; ! } ! else ! { ! angle = 0; ! axis[ 0 ] = 1; ! axis[ 1 ] = 0; ! axis[ 2 ] = 0; ! } ! // convert to degrees ! angle = radToDeg( angle ); ! } ! real getRoll() const ! { ! return radToDeg( atan2( 2 * ( mData[ 2 ] * mData[ 3 ] + mData[ 0 ] * mData[ 1 ] ), ! mData[ 0 ] * mData[ 0 ] - mData[ 1 ] * mData[ 1 ] - mData[ 2 ] * mData[ 2 ] + ! mData[ 3 ] * mData[ 3 ] ) ); ! } ! real getPitch() const ! { ! return radToDeg( asin( -2 * ( mData[ 1 ] * mData[ 3 ] - mData[ 0 ] * mData[ 2 ] ) ) ); ! } ! real getYaw() const ! { ! return radToDeg( atan2( 2 * ( mData[ 1 ] * mData[ 2 ] + mData[ 0 ] * mData[ 3 ] ), ! mData[ 0 ] * mData[ 0 ] + mData[ 1 ] * mData[ 1 ] - mData[ 2 ] * mData[ 2 ] - ! mData[ 3 ] * mData[ 3 ] ) ); ! } ! inline real & operator[] ( unsigned int i ) ! { ! assert( i < 4 ); ! return mData[ i ]; ! } ! inline const real & operator[] ( unsigned int i ) const ! { ! assert( i < 4 ); ! return mData[ i ]; ! } }; ! inline Quaternion operator+( const Quaternion &q1, const Quaternion &q2 ) ! { ! return Quaternion( q1[ 0 ] + q2[ 0 ], q1[ 1 ] + q2[ 1 ], q1[ 2 ] + q2[ 2 ], q1[ 3 ] + ! q2[ 3 ] ); ! } ! ! inline Quaternion operator-( const Quaternion &q1, const Quaternion &q2 ) ! { ! return Quaternion( q1[ 0 ] - q2[ 0 ], q1[ 1 ] - q2[ 1 ], q1[ 2 ] - q2[ 2 ], q1[ 3 ] - ! q2[ 3 ] ); ! } ! ! inline bool operator==( const Quaternion &q1, const Quaternion &q2 ) ! { ! if ( !areEqual( q1[ 0 ], q2[ 0 ] ) || !areEqual( q1[ 1 ] , q2[ 1 ] ) || ! !areEqual( q1[ 2 ] , q2[ 2 ] ) || !areEqual( q1[ 3 ] , q2[ 3 ] ) ) ! return false; ! else ! return true; ! } ! ! inline bool operator!=( const Quaternion &q1, const Quaternion &q2 ) ! { ! if ( !areEqual( q1[ 0 ], q2[ 0 ] ) || !areEqual( q1[ 1 ] , q2[ 1 ] ) || ! !areEqual( q1[ 2 ] , q2[ 2 ] ) || !areEqual( q1[ 3 ] , q2[ 3 ] ) ) ! return true; ! else ! return false; ! } ! ! inline Quaternion operator*( const Quaternion& q, real scalar ) ! { ! return Quaternion( scalar * q[ 0 ], scalar * q[ 1 ], scalar * q[ 2 ], ! scalar * q[ 3 ] ); ! } ! inline Quaternion operator*( real scalar, const Quaternion& q ) ! { ! return Quaternion( scalar * q[ 0 ], scalar * q[ 1 ], scalar * q[ 2 ], ! scalar * q[ 3 ] ); ! } - inline std::ostream& operator<<( std::ostream& o, const Quaternion& q ) - { - return o << "[" << q[ 0 ] << " " << q[ 1 ] << " " << q[ 2 ] << " " - << q[ 3 ] << "]"; - } } --- 32,87 ---- #include "OpalMath.h" + // system headers + #include <iostream> + namespace opal { ! class Vec3r; ! class Quaternion { public: ! real w; ! real x; ! real y; ! real z; ! Quaternion(); ! Quaternion( real ww, real xx, real yy, real zz ); ! Quaternion( const Quaternion& src ); ! void set( real ww, real xx, real yy, real zz ); ! real lengthSquared() const; ! real length() const; ! void normalize(); ! void getAngleAxis( real& angle, Vec3r& axis ); ! real getRoll() const; ! real getPitch() const; ! real getYaw() const ; ! real & operator[] ( unsigned int i ); ! const real & operator[] ( unsigned int i ) const; }; ! Quaternion operator+( const Quaternion &q1, const Quaternion &q2 ); ! Quaternion operator-( const Quaternion &q1, const Quaternion &q2 ); ! Quaternion operator*( const Quaternion& q, real scalar ); ! Quaternion operator*( real scalar, const Quaternion& q ); ! bool operator==( const Quaternion &q1, const Quaternion &q2 ); ! bool operator!=( const Quaternion &q1, const Quaternion &q2 ); ! /// Prints the Quaternion to the given output stream. ! std::ostream & operator<<( std::ostream& o, const Quaternion& q ); } --- NEW FILE: Quaternion.cpp --- /************************************************************************* * * * Open Physics Abstraction Layer * * Copyright (C) 2004-2005 * * Alan Fischer ala...@gm... * * Andres Reinot an...@re... * * Tyler Streeter tyl...@gm... * * Oleksandr Lozitskiy mr....@gm... * * All rights reserved. * * Web: opal.sourceforge.net * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of EITHER: * * (1) The GNU Lesser General Public License as published by the Free * * Software Foundation; either version 2.1 of the License, or (at * * your option) any later version. The text of the GNU Lesser * * General Public License is included with this library in the * * file license-LGPL.txt. * * (2) The BSD-style license that is included with this library in * * the file license-BSD.txt. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * * license-LGPL.txt and license-BSD.txt for more details. * * * *************************************************************************/ // class headers #include "Quaternion.h" // system headers #include <cassert> // project headers #include "Vec3r.h" namespace opal { Quaternion::Quaternion() { w = 0; x = 0; y = 0; z = 0; } Quaternion::Quaternion( real ww, real xx, real yy, real zz ) { w = ww; x = xx; y = yy; z = zz; } Quaternion::Quaternion( const Quaternion& src ) { w = src.w; x = src.x; y = src.y; z = src.z; } void Quaternion::set( real ww, real xx, real yy, real zz ) { w = ww; x = xx; y = yy; z = zz; } real Quaternion::lengthSquared() const { return w * w + x * x + y * y + z * z; } real Quaternion::length() const { return sqrt( lengthSquared() ); } void Quaternion::normalize() { real len = length(); assert( 0 != len ); real factor = 1 / len; ( *this ) = ( *this ) * factor; } void Quaternion::getAngleAxis( real& angle, Vec3r& axis ) { real sqrLen = x * x + y * y + z * z; if ( sqrLen > 0 ) { angle = 2 * acos( w ); real invLen = 1 / sqrt( sqrLen ); axis.x = x * invLen; axis.y = y * invLen; axis.z = z * invLen; } else { angle = 0; axis.x = 1; axis.y = 0; axis.z = 0; } // convert to degrees angle = radToDeg( angle ); } real Quaternion::getRoll() const { return radToDeg( atan2( 2 * ( y * z + w * x ), w * w - x * x - y * y + z * z ) ); } real Quaternion::getPitch() const { return radToDeg( asin( -2 * ( x * z - w * y ) ) ); } real Quaternion::getYaw() const { return radToDeg( atan2( 2 * ( x * y + w * z ), w * w + x * x - y * y - z * z ) ); } real & Quaternion::operator[] ( unsigned int i ) { switch ( i ) { case 0: return w; case 1: return x; case 2: return y; case 3: return z; } assert( i < 4 ); return w; } const real & Quaternion::operator[] ( unsigned int i ) const { switch ( i ) { case 0: return w; case 1: return x; case 2: return y; case 3: return z; } assert( i < 4 ); return w; } Quaternion operator+( const Quaternion &q1, const Quaternion &q2 ) { return Quaternion( q1.w + q2.w, q1.x + q2.x, q1.y + q2.y, q1.z + q2.z ); } Quaternion operator-( const Quaternion &q1, const Quaternion &q2 ) { return Quaternion( q1.w - q2.w, q1.x - q2.x, q1.y - q2.y, q1.z - q2.z ); } bool operator==( const Quaternion &q1, const Quaternion &q2 ) { if ( !areEqual( q1.w, q2.w ) || !areEqual( q1.x , q2.x ) || !areEqual( q1.y , q2.y ) || !areEqual( q1.z , q2.z ) ) return false; else return true; } bool operator!=( const Quaternion &q1, const Quaternion &q2 ) { if ( !areEqual( q1.w, q2.w ) || !areEqual( q1.x , q2.x ) || !areEqual( q1.y , q2.y ) || !areEqual( q1.z , q2.z ) ) return true; else return false; } Quaternion operator*( const Quaternion& q, real scalar ) { return Quaternion( scalar * q.w, scalar * q.x, scalar * q.y, scalar * q.z ); } Quaternion operator*( real scalar, const Quaternion& q ) { return Quaternion( scalar * q.w, scalar * q.x, scalar * q.y, scalar * q.z ); } std::ostream& operator<<( std::ostream& o, const Quaternion& q ) { return o << "[" << q.w << " " << q.x << " " << q.y << " " << q.z << "]"; } } Index: Matrix44r.h =================================================================== RCS file: /cvsroot/opal/opal/src/Matrix44r.h,v retrieving revision 1.38 retrieving revision 1.39 diff -C2 -d -r1.38 -r1.39 *** Matrix44r.h 1 Dec 2005 04:54:44 -0000 1.38 --- Matrix44r.h 1 Dec 2005 19:34:03 -0000 1.39 *************** *** 247,252 **** inline void setQuaternion( real w, real x, real y, real z ) { ! if ( !( x == 0 && y == 0 && z == 0 ) ) ! setRotation( radToDeg( w ), x, y, z ); } --- 247,256 ---- inline void setQuaternion( real w, real x, real y, real z ) { ! real angle; ! Vec3r axis; ! Quaternion q( w, x, y, z ); ! q.getAngleAxis( angle, axis ); ! ! setRotation( angle, axis.x, axis.y, axis.z ); } |