00001 #ifndef TETHERED_DRIVE_METHOD
00002 #define TETHERED_DRIVE_METHOD
00003
00004 #include <gator/TravelMethod.h>
00005 #include "ani/Dynamics/Body.h"
00006 #include "ani/Dynamics/Operator.h"
00007 #include "ani/Dynamics/solvers/EulerODEsolver.h"
00008 #include "ani/Dynamics/solvers/RungeKuttaODEsolver.h"
00009 #include "ani/Dynamics/DynamicSystem.h"
00010
00011 #include "gator/TireForceOperator.h"
00012 #include "gator/AccelerateOperator.h"
00013 #include "gator/GravityOperator.h"
00014 #include "gator/DriveOperator.h"
00015 #include "gator/CollisionResponseOperator.h"
00016 #include "gator/TetherOperator.h"
00017 #include "TetherOperator.h"
00018
00019 namespace gator
00020 {
00024 class TetheredDriveMethod : public TravelMethod
00025 {
00026 public:
00027 TetheredDriveMethod() : TravelMethod(),
00028 mTireForce( new TireForceOperator(mAvatar) ),
00029 mNavigator( new DriveNavigationOperator(mAvatar) ),
00030 mCollider( new CollisionResponseOperator )
00031 {
00032 boost::shared_ptr<ani::Operator<ani::Body> > gravity( new Acceleration( 0,-9.8f * 4.0f, 0 ) );
00033 boost::shared_ptr<ani::Operator<ani::Body> > tether( new TetherOperator( mCamera, mAvatar ) );
00034
00035
00036
00037
00038 mAvatar->setMass( 100.0f );
00039 mAvatar->setVolume( gmtl::Vec3f( 1, 1, 1 ) );
00040 mAvatar->setPosition( gmtl::Vec3f( 0, 20, -20 ));
00041 mCollider->setElastic( 0.2f );
00042 mTireForce->setCollisionDetector( mCollisionDetector );
00043 mCollider->setCollisionDetector( mCollisionDetector );
00044
00045 this->push_back( gravity );
00046 this->push_back( boost::shared_dynamic_cast<ani::Operator<ani::Body> >( mNavigator ) );
00047
00048
00049 this->push_back( boost::shared_dynamic_cast<ani::Operator<ani::Body> >( mCollider ) );
00050 this->push_back( boost::shared_dynamic_cast<ani::Operator<ani::Body> >( mTireForce ) );
00051 this->push_back( tether );
00052 this->push_back( mAvatar );
00053 this->push_back( mCamera );
00054 }
00055
00057 virtual void digitalInput( unsigned int id, EdgeState value )
00058 {
00059 float t = 1.0f;
00060
00061 switch (id)
00062 {
00063 case 0:
00064 if (value == DOWN)
00065 {
00066 gmtl::Matrix44f pointerMat;
00067 gmtl::Vec3f dir;
00068 dir = pointerMat * gmtl::Vec3f( 0.0f, 0.0f, -3000.0f );
00069
00070
00071 mNavigator->force( dir );
00072 }
00073 else if (value== EDGE_DOWN)
00074 {
00075 gmtl::Matrix44f pointerMat;
00076 gmtl::Vec3f dir;
00077 dir = pointerMat * gmtl::Vec3f( 0.0f, 0.0f, -6000.0f );
00078 mNavigator->force( dir );
00079 }
00080 break;
00081 case 1:
00082 if (value == DOWN)
00083 mNavigator->stop();
00084 break;
00085 case 2:
00086 if (value == DOWN)
00087 {
00088 gmtl::Vec3f q;
00089 q.set( 0.0f, t, 0.0f );
00090 mNavigator->torque( q );
00091 }
00092 break;
00093 case 3:
00094 if (value == DOWN)
00095 {
00096 gmtl::Vec3f q;
00097 q.set( 0.0f, -t, 0.0f );
00098 mNavigator->torque( q );
00099 }
00100 break;
00101 case 4:
00102 {
00103 gmtl::Vec3f accel( 0, 25, 0 );
00104 if (value == EDGE_DOWN)
00105 mNavigator->impulseForce( accel * mAvatar->mass() );
00106 break;
00107 }
00108 default: break;
00109 }
00110 }
00111
00113 virtual void analogInput( unsigned int id, float value )
00114 {
00115 switch (id)
00116 {
00117 case 0:
00118 gmtl::Vec3f q;
00119 q.set( 0.0f, value, 0.0f );
00120 mNavigator->torque( q );
00121 break;
00122 }
00123 }
00124
00126 virtual void xformInput( unsigned int id, const gmtl::Matrix44f& value ) {}
00127
00132 virtual void setCollisionDetector( CollisionDetectorPtr& detect )
00133 {
00134 TravelMethod::setCollisionDetector( detect );
00135 mTireForce->setCollisionDetector( detect );
00136 mCollider->setCollisionDetector( detect );
00137 }
00138
00139
00140 virtual void setPosition( const gmtl::Matrix44f& value )
00141 {
00142 gmtl::Vec3f pos;
00143 gmtl::Quatf rot;
00144 gmtl::setTrans( pos, value );
00145 gmtl::set( rot, value );
00146
00147 mAvatar->setPosition( pos );
00148 mAvatar->setRotation( rot );
00149 }
00150
00151 virtual gmtl::Matrix44f getPosition()
00152 {
00153 gmtl::Matrix44f mat;
00154 gmtl::set( mat, mAvatar->rotation() );
00155 gmtl::setTrans( mat, (gmtl::Vec3f)mAvatar->position() );
00156 return mat;
00157 }
00158
00159 protected:
00160
00161 boost::shared_ptr< TireForceOperator > mTireForce;
00162 boost::shared_ptr< DriveNavigationOperator > mNavigator;
00163 boost::shared_ptr< CollisionResponseOperator > mCollider;
00164 private:
00165
00167
00168
00170
00171 protected:
00172 };
00173 }
00174
00175 #endif