btRaycastVehicle.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2005 Erwin Coumans http://continuousphysics.com/Bullet/
00003  *
00004  * Permission to use, copy, modify, distribute and sell this software
00005  * and its documentation for any purpose is hereby granted without fee,
00006  * provided that the above copyright notice appear in all copies.
00007  * Erwin Coumans makes no representations about the suitability 
00008  * of this software for any purpose.  
00009  * It is provided "as is" without express or implied warranty.
00010 */
00011 #ifndef RAYCASTVEHICLE_H
00012 #define RAYCASTVEHICLE_H
00013 
00014 #include "BulletDynamics/Dynamics/btRigidBody.h"
00015 #include "BulletDynamics/ConstraintSolver/btTypedConstraint.h"
00016 #include "btVehicleRaycaster.h"
00017 class btDynamicsWorld;
00018 #include "LinearMath/btAlignedObjectArray.h"
00019 #include "btWheelInfo.h"
00020 #include "BulletDynamics/Dynamics/btActionInterface.h"
00021 
00022 class btVehicleTuning;
00023 
00025 class btRaycastVehicle : public btActionInterface
00026 {
00027 
00028                 btAlignedObjectArray<btVector3> m_forwardWS;
00029                 btAlignedObjectArray<btVector3> m_axle;
00030                 btAlignedObjectArray<btScalar>  m_forwardImpulse;
00031                 btAlignedObjectArray<btScalar>  m_sideImpulse;
00032 
00033 public:
00034         class btVehicleTuning
00035                 {
00036                         public:
00037 
00038                         btVehicleTuning()
00039                                 :m_suspensionStiffness(btScalar(5.88)),
00040                                 m_suspensionCompression(btScalar(0.83)),
00041                                 m_suspensionDamping(btScalar(0.88)),
00042                                 m_maxSuspensionTravelCm(btScalar(500.)),
00043                                 m_frictionSlip(btScalar(10.5)),
00044                                 m_maxSuspensionForce(btScalar(6000.))
00045                         {
00046                         }
00047                         btScalar        m_suspensionStiffness;
00048                         btScalar        m_suspensionCompression;
00049                         btScalar        m_suspensionDamping;
00050                         btScalar        m_maxSuspensionTravelCm;
00051                         btScalar        m_frictionSlip;
00052                         btScalar        m_maxSuspensionForce;
00053 
00054                 };
00055 private:
00056 
00057         btScalar        m_tau;
00058         btScalar        m_damping;
00059         btVehicleRaycaster*     m_vehicleRaycaster;
00060         btScalar                m_pitchControl;
00061         btScalar        m_steeringValue; 
00062         btScalar m_currentVehicleSpeedKmHour;
00063 
00064         btRigidBody* m_chassisBody;
00065 
00066         int m_indexRightAxis;
00067         int m_indexUpAxis;
00068         int     m_indexForwardAxis;
00069 
00070         void defaultInit(const btVehicleTuning& tuning);
00071 
00072 public:
00073 
00074         //constructor to create a car from an existing rigidbody
00075         btRaycastVehicle(const btVehicleTuning& tuning,btRigidBody* chassis,    btVehicleRaycaster* raycaster );
00076 
00077         virtual ~btRaycastVehicle() ;
00078 
00079 
00081         virtual void updateAction( btCollisionWorld* collisionWorld, btScalar step)
00082         {
00083         (void) collisionWorld;
00084                 updateVehicle(step);
00085         }
00086         
00087 
00089         void    debugDraw(btIDebugDraw* debugDrawer);
00090                         
00091         const btTransform& getChassisWorldTransform() const;
00092         
00093         btScalar rayCast(btWheelInfo& wheel);
00094 
00095         virtual void updateVehicle(btScalar step);
00096         
00097         
00098         void resetSuspension();
00099 
00100         btScalar        getSteeringValue(int wheel) const;
00101 
00102         void    setSteeringValue(btScalar steering,int wheel);
00103 
00104 
00105         void    applyEngineForce(btScalar force, int wheel);
00106 
00107         const btTransform&      getWheelTransformWS( int wheelIndex ) const;
00108 
00109         void    updateWheelTransform( int wheelIndex, bool interpolatedTransform = true );
00110         
00111         void    setRaycastWheelInfo( int wheelIndex , bool isInContact, const btVector3& hitPoint, const btVector3& hitNormal,btScalar depth);
00112 
00113         btWheelInfo&    addWheel( const btVector3& connectionPointCS0, const btVector3& wheelDirectionCS0,const btVector3& wheelAxleCS,btScalar suspensionRestLength,btScalar wheelRadius,const btVehicleTuning& tuning, bool isFrontWheel);
00114 
00115         inline int              getNumWheels() const {
00116                 return int (m_wheelInfo.size());
00117         }
00118         
00119         btAlignedObjectArray<btWheelInfo>       m_wheelInfo;
00120 
00121 
00122         const btWheelInfo&      getWheelInfo(int index) const;
00123 
00124         btWheelInfo&    getWheelInfo(int index);
00125 
00126         void    updateWheelTransformsWS(btWheelInfo& wheel , bool interpolatedTransform = true);
00127 
00128         
00129         void setBrake(btScalar brake,int wheelIndex);
00130 
00131         void    setPitchControl(btScalar pitch)
00132         {
00133                 m_pitchControl = pitch;
00134         }
00135         
00136         void    updateSuspension(btScalar deltaTime);
00137 
00138         virtual void    updateFriction(btScalar timeStep);
00139 
00140 
00141 
00142         inline btRigidBody* getRigidBody()
00143         {
00144                 return m_chassisBody;
00145         }
00146 
00147         const btRigidBody* getRigidBody() const
00148         {
00149                 return m_chassisBody;
00150         }
00151 
00152         inline int      getRightAxis() const
00153         {
00154                 return m_indexRightAxis;
00155         }
00156         inline int getUpAxis() const
00157         {
00158                 return m_indexUpAxis;
00159         }
00160 
00161         inline int getForwardAxis() const
00162         {
00163                 return m_indexForwardAxis;
00164         }
00165 
00166         
00168         btVector3 getForwardVector() const
00169         {
00170                 const btTransform& chassisTrans = getChassisWorldTransform(); 
00171 
00172                 btVector3 forwardW ( 
00173                           chassisTrans.getBasis()[0][m_indexForwardAxis], 
00174                           chassisTrans.getBasis()[1][m_indexForwardAxis], 
00175                           chassisTrans.getBasis()[2][m_indexForwardAxis]); 
00176 
00177                 return forwardW;
00178         }
00179 
00181         btScalar        getCurrentSpeedKmHour() const
00182         {
00183                 return m_currentVehicleSpeedKmHour;
00184         }
00185 
00186         virtual void    setCoordinateSystem(int rightIndex,int upIndex,int forwardIndex)
00187         {
00188                 m_indexRightAxis = rightIndex;
00189                 m_indexUpAxis = upIndex;
00190                 m_indexForwardAxis = forwardIndex;
00191         }
00192 
00193 
00194 
00195 };
00196 
00197 class btDefaultVehicleRaycaster : public btVehicleRaycaster
00198 {
00199         btDynamicsWorld*        m_dynamicsWorld;
00200 public:
00201         btDefaultVehicleRaycaster(btDynamicsWorld* world)
00202                 :m_dynamicsWorld(world)
00203         {
00204         }
00205 
00206         virtual void* castRay(const btVector3& from,const btVector3& to, btVehicleRaycasterResult& result);
00207 
00208 };
00209 
00210 
00211 #endif //RAYCASTVEHICLE_H
00212 

Generated on Mon Feb 15 22:17:05 2010 for Bullet Collision Detection & Physics Library by  doxygen 1.6.1