btRaycastVehicle.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. /*
  2. * Copyright (c) 2005 Erwin Coumans https://bulletphysics.org
  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 "BulletDynamics/Dynamics/btRigidBody.h"
  14. #include "BulletDynamics/ConstraintSolver/btTypedConstraint.h"
  15. #include "btVehicleRaycaster.h"
  16. class btDynamicsWorld;
  17. #include "LinearMath/btAlignedObjectArray.h"
  18. #include "btWheelInfo.h"
  19. #include "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. btVehicleRaycaster* m_vehicleRaycaster;
  53. btScalar m_pitchControl;
  54. btScalar m_steeringValue;
  55. btScalar m_currentVehicleSpeedKmHour;
  56. btRigidBody* m_chassisBody;
  57. int m_indexRightAxis;
  58. int m_indexUpAxis;
  59. int m_indexForwardAxis;
  60. void defaultInit(const btVehicleTuning& tuning);
  61. public:
  62. //constructor to create a car from an existing rigidbody
  63. btRaycastVehicle(const btVehicleTuning& tuning, btRigidBody* chassis, btVehicleRaycaster* raycaster);
  64. virtual ~btRaycastVehicle();
  65. ///btActionInterface interface
  66. virtual void updateAction(btCollisionWorld* collisionWorld, btScalar step)
  67. {
  68. (void)collisionWorld;
  69. updateVehicle(step);
  70. }
  71. ///btActionInterface interface
  72. void debugDraw(btIDebugDraw* debugDrawer);
  73. const btTransform& getChassisWorldTransform() const;
  74. btScalar rayCast(btWheelInfo& wheel);
  75. virtual void updateVehicle(btScalar step);
  76. void resetSuspension();
  77. btScalar getSteeringValue(int wheel) const;
  78. void setSteeringValue(btScalar steering, int wheel);
  79. void applyEngineForce(btScalar force, int wheel);
  80. const btTransform& getWheelTransformWS(int wheelIndex) const;
  81. void updateWheelTransform(int wheelIndex, bool interpolatedTransform = true);
  82. // void setRaycastWheelInfo( int wheelIndex , bool isInContact, const btVector3& hitPoint, const btVector3& hitNormal,btScalar depth);
  83. btWheelInfo& addWheel(const btVector3& connectionPointCS0, const btVector3& wheelDirectionCS0, const btVector3& wheelAxleCS, btScalar suspensionRestLength, btScalar wheelRadius, const btVehicleTuning& tuning, bool isFrontWheel);
  84. inline int getNumWheels() const
  85. {
  86. return int(m_wheelInfo.size());
  87. }
  88. btAlignedObjectArray<btWheelInfo> m_wheelInfo;
  89. const btWheelInfo& getWheelInfo(int index) const;
  90. btWheelInfo& getWheelInfo(int index);
  91. void updateWheelTransformsWS(btWheelInfo& wheel, bool interpolatedTransform = true);
  92. void setBrake(btScalar brake, int wheelIndex);
  93. void setPitchControl(btScalar pitch)
  94. {
  95. m_pitchControl = pitch;
  96. }
  97. void updateSuspension(btScalar deltaTime);
  98. virtual void updateFriction(btScalar timeStep);
  99. inline btRigidBody* getRigidBody()
  100. {
  101. return m_chassisBody;
  102. }
  103. const btRigidBody* getRigidBody() const
  104. {
  105. return m_chassisBody;
  106. }
  107. inline int getRightAxis() const
  108. {
  109. return m_indexRightAxis;
  110. }
  111. inline int getUpAxis() const
  112. {
  113. return m_indexUpAxis;
  114. }
  115. inline int getForwardAxis() const
  116. {
  117. return m_indexForwardAxis;
  118. }
  119. ///Worldspace forward vector
  120. btVector3 getForwardVector() const
  121. {
  122. const btTransform& chassisTrans = getChassisWorldTransform();
  123. btVector3 forwardW(
  124. chassisTrans.getBasis()[0][m_indexForwardAxis],
  125. chassisTrans.getBasis()[1][m_indexForwardAxis],
  126. chassisTrans.getBasis()[2][m_indexForwardAxis]);
  127. return forwardW;
  128. }
  129. ///Velocity of vehicle (positive if velocity vector has same direction as foward vector)
  130. btScalar getCurrentSpeedKmHour() const
  131. {
  132. return m_currentVehicleSpeedKmHour;
  133. }
  134. virtual void setCoordinateSystem(int rightIndex, int upIndex, int forwardIndex)
  135. {
  136. m_indexRightAxis = rightIndex;
  137. m_indexUpAxis = upIndex;
  138. m_indexForwardAxis = forwardIndex;
  139. }
  140. ///backwards compatibility
  141. int getUserConstraintType() const
  142. {
  143. return m_userConstraintType;
  144. }
  145. void setUserConstraintType(int userConstraintType)
  146. {
  147. m_userConstraintType = userConstraintType;
  148. };
  149. void setUserConstraintId(int uid)
  150. {
  151. m_userConstraintId = uid;
  152. }
  153. int getUserConstraintId() const
  154. {
  155. return m_userConstraintId;
  156. }
  157. };
  158. class btDefaultVehicleRaycaster : public btVehicleRaycaster
  159. {
  160. btDynamicsWorld* m_dynamicsWorld;
  161. public:
  162. btDefaultVehicleRaycaster(btDynamicsWorld* world)
  163. : m_dynamicsWorld(world)
  164. {
  165. }
  166. virtual void* castRay(const btVector3& from, const btVector3& to, btVehicleRaycasterResult& result);
  167. };
  168. #endif //BT_RAYCASTVEHICLE_H