btRaycastVehicle.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. /*
  2. * Copyright (c) 2005 Erwin Coumans http://continuousphysics.com/Bullet/
  3. *
  4. * Permission to use, copy, modify, distribute and sell this software
  5. * and its documentation for any purpose is hereby granted without fee,
  6. * provided that the above copyright notice appear in all copies.
  7. * Erwin Coumans makes no representations about the suitability
  8. * of this software for any purpose.
  9. * It is provided "as is" without express or implied warranty.
  10. */
  11. #ifndef BT_RAYCASTVEHICLE_H
  12. #define BT_RAYCASTVEHICLE_H
  13. #include "bullet/BulletDynamics/Dynamics/btRigidBody.h"
  14. #include "bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.h"
  15. #include "btVehicleRaycaster.h"
  16. class btDynamicsWorld;
  17. #include "bullet/LinearMath/btAlignedObjectArray.h"
  18. #include "btWheelInfo.h"
  19. #include "bullet/BulletDynamics/Dynamics/btActionInterface.h"
  20. class btVehicleTuning;
  21. ///rayCast vehicle, very special constraint that turn a rigidbody into a vehicle.
  22. class btRaycastVehicle : public btActionInterface
  23. {
  24. btAlignedObjectArray<btVector3> m_forwardWS;
  25. btAlignedObjectArray<btVector3> m_axle;
  26. btAlignedObjectArray<btScalar> m_forwardImpulse;
  27. btAlignedObjectArray<btScalar> m_sideImpulse;
  28. ///backwards compatibility
  29. int m_userConstraintType;
  30. int m_userConstraintId;
  31. public:
  32. class btVehicleTuning
  33. {
  34. public:
  35. btVehicleTuning()
  36. :m_suspensionStiffness(btScalar(5.88)),
  37. m_suspensionCompression(btScalar(0.83)),
  38. m_suspensionDamping(btScalar(0.88)),
  39. m_maxSuspensionTravelCm(btScalar(500.)),
  40. m_frictionSlip(btScalar(10.5)),
  41. m_maxSuspensionForce(btScalar(6000.))
  42. {
  43. }
  44. btScalar m_suspensionStiffness;
  45. btScalar m_suspensionCompression;
  46. btScalar m_suspensionDamping;
  47. btScalar m_maxSuspensionTravelCm;
  48. btScalar m_frictionSlip;
  49. btScalar m_maxSuspensionForce;
  50. };
  51. private:
  52. btScalar m_tau;
  53. btScalar m_damping;
  54. btVehicleRaycaster* m_vehicleRaycaster;
  55. btScalar m_pitchControl;
  56. btScalar m_steeringValue;
  57. btScalar m_currentVehicleSpeedKmHour;
  58. btRigidBody* m_chassisBody;
  59. int m_indexRightAxis;
  60. int m_indexUpAxis;
  61. int m_indexForwardAxis;
  62. void defaultInit(const btVehicleTuning& tuning);
  63. public:
  64. //constructor to create a car from an existing rigidbody
  65. btRaycastVehicle(const btVehicleTuning& tuning,btRigidBody* chassis, btVehicleRaycaster* raycaster );
  66. virtual ~btRaycastVehicle() ;
  67. ///btActionInterface interface
  68. virtual void updateAction( btCollisionWorld* collisionWorld, btScalar step)
  69. {
  70. (void) collisionWorld;
  71. updateVehicle(step);
  72. }
  73. ///btActionInterface interface
  74. void debugDraw(btIDebugDraw* debugDrawer);
  75. const btTransform& getChassisWorldTransform() const;
  76. btScalar rayCast(btWheelInfo& wheel);
  77. virtual void updateVehicle(btScalar step);
  78. void resetSuspension();
  79. btScalar getSteeringValue(int wheel) const;
  80. void setSteeringValue(btScalar steering,int wheel);
  81. void applyEngineForce(btScalar force, int wheel);
  82. const btTransform& getWheelTransformWS( int wheelIndex ) const;
  83. void updateWheelTransform( int wheelIndex, bool interpolatedTransform = true );
  84. // void setRaycastWheelInfo( int wheelIndex , bool isInContact, const btVector3& hitPoint, const btVector3& hitNormal,btScalar depth);
  85. btWheelInfo& addWheel( const btVector3& connectionPointCS0, const btVector3& wheelDirectionCS0,const btVector3& wheelAxleCS,btScalar suspensionRestLength,btScalar wheelRadius,const btVehicleTuning& tuning, bool isFrontWheel);
  86. inline int getNumWheels() const {
  87. return int (m_wheelInfo.size());
  88. }
  89. btAlignedObjectArray<btWheelInfo> m_wheelInfo;
  90. const btWheelInfo& getWheelInfo(int index) const;
  91. btWheelInfo& getWheelInfo(int index);
  92. void updateWheelTransformsWS(btWheelInfo& wheel , bool interpolatedTransform = true);
  93. void setBrake(btScalar brake,int wheelIndex);
  94. void setPitchControl(btScalar pitch)
  95. {
  96. m_pitchControl = pitch;
  97. }
  98. void updateSuspension(btScalar deltaTime);
  99. virtual void updateFriction(btScalar timeStep);
  100. inline btRigidBody* getRigidBody()
  101. {
  102. return m_chassisBody;
  103. }
  104. const btRigidBody* getRigidBody() const
  105. {
  106. return m_chassisBody;
  107. }
  108. inline int getRightAxis() const
  109. {
  110. return m_indexRightAxis;
  111. }
  112. inline int getUpAxis() const
  113. {
  114. return m_indexUpAxis;
  115. }
  116. inline int getForwardAxis() const
  117. {
  118. return m_indexForwardAxis;
  119. }
  120. ///Worldspace forward vector
  121. btVector3 getForwardVector() const
  122. {
  123. const btTransform& chassisTrans = getChassisWorldTransform();
  124. btVector3 forwardW (
  125. chassisTrans.getBasis()[0][m_indexForwardAxis],
  126. chassisTrans.getBasis()[1][m_indexForwardAxis],
  127. chassisTrans.getBasis()[2][m_indexForwardAxis]);
  128. return forwardW;
  129. }
  130. ///Velocity of vehicle (positive if velocity vector has same direction as foward vector)
  131. btScalar getCurrentSpeedKmHour() const
  132. {
  133. return m_currentVehicleSpeedKmHour;
  134. }
  135. virtual void setCoordinateSystem(int rightIndex,int upIndex,int forwardIndex)
  136. {
  137. m_indexRightAxis = rightIndex;
  138. m_indexUpAxis = upIndex;
  139. m_indexForwardAxis = forwardIndex;
  140. }
  141. ///backwards compatibility
  142. int getUserConstraintType() const
  143. {
  144. return m_userConstraintType ;
  145. }
  146. void setUserConstraintType(int userConstraintType)
  147. {
  148. m_userConstraintType = userConstraintType;
  149. };
  150. void setUserConstraintId(int uid)
  151. {
  152. m_userConstraintId = uid;
  153. }
  154. int getUserConstraintId() const
  155. {
  156. return m_userConstraintId;
  157. }
  158. };
  159. class btDefaultVehicleRaycaster : public btVehicleRaycaster
  160. {
  161. btDynamicsWorld* m_dynamicsWorld;
  162. public:
  163. btDefaultVehicleRaycaster(btDynamicsWorld* world)
  164. :m_dynamicsWorld(world)
  165. {
  166. }
  167. virtual void* castRay(const btVector3& from,const btVector3& to, btVehicleRaycasterResult& result);
  168. };
  169. #endif //BT_RAYCASTVEHICLE_H