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/SimpleFlyMethod.h

Go to the documentation of this file.
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          // 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,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          // goes last
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: // accel
00064             if (value == DOWN)
00065             {
00066                gmtl::Vec3f dir;
00067                dir = mPointerMatrix * gmtl::Vec3f( 0.0f, 0.0f, -3000.0f );
00068                //std::cout<<"accel "<<dir<<"\n"<<std::flush;
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: // stop
00081             if (value == DOWN)
00082                mNavigator->stop();
00083             break;
00084          case 2: // turn left
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: // turn right
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: // rise
00101          {
00102             // f = ma = mass * distance/sec^2
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: // drop
00109          {
00110             // f = ma = mass * distance/sec^2
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: // rotate with current xform 0 input
00117             mNavigator->torque( gmtl::Vec3f( 0.0f, gmtl::makeYRot( mPointerMatrix ), 0.0f ) );
00118             break;
00119          case 7: // reset
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: // turn left or right.
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: // wand input
00144             // if (mRotateAlways)
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       // physics operators
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       /*#  GlueOperator lnkGlueOperator; */
00192 protected:
00193    };
00194 } // end namespace gator
00195 
00196 #endif

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