Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

c:/home/kevn/src/animaniac/gator/TetheredDriveMethod.h

Go to the documentation of this file.
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          // Pounds to Kilograms, multiply Pounds by 0.45
00036          // Kilograms to Pounds, multiply Kilograms by 2.2
00037          //mAvatar->setMass( 170.0f * 0.45f );
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          // goes last
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: // accel
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                //std::cout<<"accel "<<dir<<"\n"<<std::flush;
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: // stop
00082             if (value == DOWN)
00083                mNavigator->stop();
00084             break;
00085          case 2: // turn left
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: // turn right
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: // jump
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: // turn left or right.
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       // physics system
00161       boost::shared_ptr< TireForceOperator >         mTireForce;
00162       boost::shared_ptr< DriveNavigationOperator >   mNavigator;
00163       boost::shared_ptr< CollisionResponseOperator > mCollider;
00164 private:
00165 
00167       /*#  Gravity lnkGravity; */
00168 
00170       /*#  TetherOperator lnkTetherOperator; */
00171 protected:
00172    };
00173 } // end namespace gator
00174 
00175 #endif

Generated on Wed Jun 12 01:54:03 2002 for Animaniac by doxygen1.2.15