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
Documentation generated on Mon Jun 9 11:45:57 2008 |
Generated with doxygen by Dimitri van Heesch , 1997-2007 |