00001 #ifndef SIMPLE_FLY_METHOD
00002 #define SIMPLE_FLY_METHOD
00003
00004 #include <gmtl/Generate.h>
00005 #include <gator/TravelMethod.h>
00006 #include "ani/Dynamics/Body.h"
00007 #include "ani/Dynamics/Operator.h"
00008 #include "ani/Dynamics/solvers/EulerODEsolver.h"
00009 #include "ani/Dynamics/solvers/RungeKuttaODEsolver.h"
00010 #include "ani/Dynamics/DynamicSystem.h"
00011
00012 #include "gator/TireForceOperator.h"
00013 #include "gator/AccelerateOperator.h"
00014 #include "gator/GravityOperator.h"
00015 #include "gator/DriveOperator.h"
00016 #include "gator/CollisionResponseOperator.h"
00017
00018 namespace gator
00019 {
00023 class SimpleFlyMethod : public TravelMethod
00024 {
00025 public:
00026 SimpleFlyMethod() : TravelMethod(),
00027 mTireForce( new TireForceOperator(mAvatar) ),
00028 mNavigator( new DriveNavigationOperator(mAvatar) ),
00029 mCollider( new CollisionResponseOperator )
00030 {
00031 SetEqualOperator* bok;
00032 boost::shared_ptr<ani::Operator<ani::Body> > equal( bok = new SetEqualOperator( mCamera, mAvatar ) );
00033 bok->setOffset( gmtl::Vec3f( 0, 1.0f, -1.0f ) );
00034
00035
00036
00037
00038 mAvatar->setMass( 100.0f );
00039 mAvatar->setVolume( gmtl::Vec3f( 1,1,1 ) );
00040 mAvatar->setPosition( gmtl::Vec3f( 0,40,-20 ));
00041 mCollider->setElastic( 0.05f );
00042 mTireForce->setAirSteering( true );
00043 mTireForce->setCollisionDetector( mCollisionDetector );
00044 mCollider->setCollisionDetector( mCollisionDetector );
00045
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> >( mTireForce ) );
00050 this->push_back( boost::shared_dynamic_cast<ani::Operator<ani::Body> >( mCollider ) );
00051 this->push_back( equal );
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::Vec3f dir;
00067 dir = mPointerMatrix * gmtl::Vec3f( 0.0f, 0.0f, -3000.0f );
00068
00069
00070 mNavigator->force( dir );
00071 }
00072 else if (value== EDGE_DOWN)
00073 {
00074 gmtl::Matrix44f pointerMat;
00075 gmtl::Vec3f dir;
00076 dir = pointerMat * gmtl::Vec3f( 0.0f, 0.0f, -6000.0f );
00077 mNavigator->force( dir );
00078 }
00079 break;
00080 case 1:
00081 if (value == DOWN)
00082 mNavigator->stop();
00083 break;
00084 case 2:
00085 if (value == DOWN)
00086 {
00087 gmtl::Vec3f q;
00088 q.set( 0.0f, t, 0.0f );
00089 mNavigator->torque( q );
00090 }
00091 break;
00092 case 3:
00093 if (value == DOWN)
00094 {
00095 gmtl::Vec3f q;
00096 q.set( 0.0f, -t, 0.0f );
00097 mNavigator->torque( q );
00098 }
00099 break;
00100 case 4:
00101 {
00102
00103 float force = mAvatar->mass() * 100.0f;
00104 if (value == DOWN)
00105 mNavigator->force( gmtl::Vec3f( 0, force ,0 ) );
00106 break;
00107 }
00108 case 5:
00109 {
00110
00111 float force = mAvatar->mass() * 100.0f;
00112 if (value == DOWN)
00113 mNavigator->force( gmtl::Vec3f( 0, -force ,0 ) );
00114 break;
00115 }
00116 case 6:
00117 mNavigator->torque( gmtl::Vec3f( 0.0f, gmtl::makeYRot( mPointerMatrix ), 0.0f ) );
00118 break;
00119 case 7:
00120 if (value == EDGE_DOWN)
00121 this->reset();
00122 break;
00123 default: break;
00124 }
00125 }
00126
00128 virtual void analogInput( unsigned int id, float value )
00129 {
00130 switch (id)
00131 {
00132 case 0:
00133 mNavigator->torque( gmtl::Vec3f( 0.0f, value, 0.0f ) );
00134 break;
00135 }
00136 }
00137
00139 virtual void xformInput( unsigned int id, const gmtl::Matrix44f& value )
00140 {
00141 switch (id)
00142 {
00143 case 0:
00144
00145 mNavigator->torque( gmtl::Vec3f( 0.0f, gmtl::makeYRot( value ), 0.0f ) );
00146 mPointerMatrix = value;
00147 break;
00148 default: break;
00149 }
00150 }
00151
00156 virtual void setCollisionDetector( CollisionDetectorPtr& detect )
00157 {
00158 TravelMethod::setCollisionDetector( detect );
00159 mTireForce->setCollisionDetector( detect );
00160 mCollider->setCollisionDetector( detect );
00161 }
00162
00163 virtual void setPosition( const gmtl::Matrix44f& value )
00164 {
00165 gmtl::Vec3f pos;
00166 gmtl::Quatf rot;
00167 gmtl::setTrans( pos, value );
00168 gmtl::set( rot, value );
00169
00170 mAvatar->setPosition( pos );
00171 mAvatar->setRotation( rot );
00172 }
00173
00174 virtual gmtl::Matrix44f getPosition()
00175 {
00176 gmtl::Matrix44f mat;
00177 gmtl::set( mat, mAvatar->rotation() );
00178 gmtl::setTrans( mat, (gmtl::Vec3f)mAvatar->position() );
00179 return mat;
00180 }
00181
00182 protected:
00183
00184 boost::shared_ptr< TireForceOperator > mTireForce;
00185 boost::shared_ptr< DriveNavigationOperator > mNavigator;
00186 boost::shared_ptr< CollisionResponseOperator > mCollider;
00187 gmtl::Matrix44f mPointerMatrix;
00188 private:
00189
00191
00192 protected:
00193 };
00194 }
00195
00196 #endif