OMKTracker.cpp

Go to the documentation of this file.
00001 #include "OMKTracker.h"
00002 #include "OMKAttribute.inl"
00003 #include "OMKTracer.h"
00004 #include "OMKTransformType.h"
00005 
00006 using namespace OMK ;
00007 using namespace OMK::Type ;
00008 //-------------------------------------------------------------------------
00009 REGISTER_OBJECT_FACTORY( Tracker, "Tracker" ) ;
00010 //-----------------------------------------------------------------------------
00011 
00012 Tracker::Tracker( Controller& ctrl, const ObjectDescriptor& objectDescriptor )
00013 : OMK::SimplePoint( ctrl, objectDescriptor ), 
00014   _speed( "Speed", 0.1f ),
00015   _target( "Target", Transform( Wm4::Vector3f::ZERO )  ),
00016   _followOrientation( false )
00017 { 
00018   addAttribute( _speed ) ;
00019   addAttribute( _target ) ;
00020 }
00021 
00022 //-----------------------------------------------------------------------------
00023 
00024 Tracker::~Tracker( void ) 
00025 {
00026 }
00027 //-----------------------------------------------------------------------------
00028 bool Tracker::loadParameters( const ConfigurationParameterDescriptor * node )
00029 {
00030   SimplePoint::loadParameters( node ) ;
00031   ParametersAccessor::get( node, "Orientation", _followOrientation ) ;
00032   
00033   _refPosition = _position.get() ;
00034   if( _target.get().getTranslate() != _refPosition.getTranslate() )
00035   {
00036     _refOrientation =  _target.get().getTranslate() - _refPosition.getTranslate() ;
00037     _refOrientation.Normalize() ;
00038   }
00039   else
00040   {
00041     _refOrientation =  Wm4::Vector3f( 1.0f, 0.0f, 0.0f ) ;
00042   }
00043   
00044   return true ; 
00045 }
00046 //-----------------------------------------------------------------------------
00047 
00048 void Tracker::computeParameters() 
00049 {
00050   if( _target.getInput() && _target.getInput()->getConnectedOutput() ) 
00051   {
00052     OMK::Type::Transform position( _refPosition ) ;
00053   
00054     Wm4::Vector3f orientation ( _target.get().getTranslate() - _position.get().getTranslate() ) ;
00055     position.setTranslate( _position.get().getTranslate() + orientation * _speed ) ;
00056     
00057     if( _followOrientation ) 
00058     { // Calculate the orientation
00059       orientation.Normalize() ;
00060       Wm4::Vector3f axis( orientation.Cross( _refOrientation ) ) ;
00061       axis.Normalize() ;
00062       float angle = -Wm4::Math<float>::ACos( orientation.Dot( _refOrientation ) ) ;
00063       Wm4::Matrix3f rotationMatrix( axis, angle ) ;
00064       position.setRotate( position.getRotate() * rotationMatrix ) ;
00065     }
00066     // Set the new position
00067     _position.set( position ) ;
00068   }
00069 }
00070 
00071 
00072 

logo OpenMask

Documentation generated on Mon Jun 9 11:45:57 2008

Generated with doxygen by Dimitri van Heesch ,   1997-2007