btRaycastVehicle.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
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
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