12,249,797 members (44,978 online)

17.2K views
27 bookmarked
Posted

# Using Quaternions Efficiently in Real-time Applications

, 10 Nov 2010 CPOL
Various methods for using quaternions in ways that maximize performance
 ```#ifndef _SLOW_GAME_ENTITY_H #define _SLOW_GAME_ENTITY_H #include "GameEntityBase.h" class SlowGameEntity : public GameEntityBase { public: virtual void updateAI( ) { D3DXVECTOR3 targetPos; updatePursuitAction( targetPos ); UpdateRotation(); } virtual void updatePursuitAction( const D3DXVECTOR3 &targetPos ) { //get vector from my pos to the target D3DXVECTOR3 worldToTarget = targetPos - pos_; //transform into my local space //transform vector with orthonormal basis - 3 dot products - 9 mults 6 adds D3DXVECTOR3 localToTarget; localToTarget.x = D3DXVec3Dot( &side_, &worldToTarget ); localToTarget.y = D3DXVec3Dot( &up_, &worldToTarget ); localToTarget.z = D3DXVec3Dot( &dir_, &worldToTarget ); //update direction to intercept target //... } virtual void transformManyVertices( unsigned int numVerts ) { D3DXVECTOR3 *vertices = new D3DXVECTOR3[ numVerts ]; D3DXVECTOR3 transformedVertex; D3DXQUATERNION conjQ; D3DXQuaternionConjugate( &conjQ, &ori_ ); for ( unsigned int i=0; i< numVerts; i++) { //transform into my local space - 15 mults 8 adds transformedVertex = vertices[i]; rotateVectorWithQuat( conjQ, transformedVertex ); } delete [] vertices; } virtual void calculateOrientation( float dt ) { //calculate new euler angles //... //update current orientation with new quaternion formed from euler angles D3DXQUATERNION tempQ; //D3DXQuaternionRotationYawPitchRoll( &tempQ, yaw_, pitch_, roll_ ); quatFromEuler( tempQ, yaw_, pitch_, roll_ ); ori_ = tempQ * ori_; /* //alternative method //create 3 new quats one for each angle D3DXQUATERNION yawQ, pitchQ, rollQ; D3DXQuaternionRotationAxis( &yawQ, up_, yaw_ ); D3DXQuaternionRotationAxis( &pitchQ, side_, pitch_ ); D3DXQuaternionRotationAxis( &rollQ, dir_, roll_ ); //multiply all 3 together to create new orientation D3DXQuaternionMultiply( &ori_, &yawQ, &pitchQ ); D3DXQuaternionMultiply( &ori_, &ori, &rollQ ); */ } }; #endif ```

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.