12,634,117 members (24,321 online)

18.1K 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 _FAST_GAME_ENTITY_H #define _FAST_GAME_ENTITY_H #include "GameEntityBase.h" class FastGameEntity : public GameEntityBase { public: virtual void updateAI( ) { D3DXVECTOR3 targetPos; updatePursuitAction( targetPos ); } virtual void updatePursuitAction( const D3DXVECTOR3 &targetPos ) { //get vector from my pos to the target D3DXVECTOR3 toTarget = targetPos - pos_; //transform into my local space - 15 mults 8 adds D3DXQUATERNION conjQ; D3DXQuaternionConjugate( &conjQ, &ori_ ); rotateVectorWithQuat( conjQ, toTarget ); //update direction to intercept target //... } virtual void transformManyVertices( unsigned int numVerts ) { UpdateRotation(); D3DXVECTOR3 *vertices = new D3DXVECTOR3[ numVerts ]; D3DXVECTOR3 col1( side_.x, up_.x, dir_.x ); D3DXVECTOR3 col2( side_.y, up_.y, dir_.y ); D3DXVECTOR3 col3( side_.z, up_.z, dir_.z ); for ( unsigned int i=0; i< numVerts; i++) { //transform into my local space //multiply vector with rotation matrix - 3 dot products - 9 mults 6 adds D3DXVECTOR3 transformedVertex; transformedVertex.x = D3DXVec3Dot( &col1, &vertices[i] ); transformedVertex.y = D3DXVec3Dot( &col2, &vertices[i] ); transformedVertex.z = D3DXVec3Dot( &col3, &vertices[i] ); } delete [] vertices; } virtual void calculateOrientation( float dt ) { //calculate angular velocity //... //update quaternion with angular velocity vector ori_ += ( (ori_ * angularVel_) * 0.5f * dt ); } }; #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.