00001 #ifndef SIMPLE_DRIVE_METHOD
00002 #define SIMPLE_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/SetEqualOperator.h"
00017 #include "gator/SimpleFlyMethod.h"
00018
00019 namespace gator
00020 {
00024 class SimpleDriveMethod : public SimpleFlyMethod
00025 {
00026 public:
00027 SimpleDriveMethod() : SimpleFlyMethod()
00028 {
00029
00030 boost::shared_ptr<ani::Operator<ani::Body> > gravity( new Acceleration( 0, -9.81 * 4.0f, 0 ) );
00031 mCollider->setElastic( 0.2f );
00032 mTireForce->setAirSteering( false );
00033 mAvatar->setPosition( gmtl::Vec3f( 0,0,0 ));
00034 this->push_front( gravity );
00035 }
00036
00038 virtual void digitalInput( unsigned int id, EdgeState value )
00039 {
00040 switch (id)
00041 {
00042 case 4:
00043 {
00044 gmtl::Vec3f accel( 0, 25, 0 );
00045 if (value == EDGE_DOWN)
00046 mNavigator->impulseForce( accel * mAvatar->mass() );
00047 break;
00048 }
00049 case 5:
00050 break;
00051 default:
00052 SimpleFlyMethod::digitalInput( id, value );
00053 break;
00054 }
00055 }
00056
00058 virtual void analogInput( unsigned int id, float value )
00059 {
00060 switch (id)
00061 {
00062 case 0:
00063 gmtl::Vec3f q;
00064 q.set( 0.0f, value, 0.0f );
00065 mNavigator->torque( q );
00066 break;
00067 }
00068 }
00069
00071 virtual void xformInput( unsigned int id, const gmtl::Matrix44f& value )
00072 {
00073 SimpleFlyMethod::xformInput( id, value );
00074 }
00075 private:
00076
00078
00079 };
00080 }
00081
00082 #endif