2 * Copyright (c) 2005 Erwin Coumans http://continuousphysics.com/Bullet/
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.
11 #ifndef BT_RAYCASTVEHICLE_H
12 #define BT_RAYCASTVEHICLE_H
14 #include "BulletDynamics/Dynamics/btRigidBody.h"
15 #include "BulletDynamics/ConstraintSolver/btTypedConstraint.h"
16 #include "btVehicleRaycaster.h"
17 class btDynamicsWorld;
18 #include "LinearMath/btAlignedObjectArray.h"
19 #include "btWheelInfo.h"
20 #include "BulletDynamics/Dynamics/btActionInterface.h"
22 class btVehicleTuning;
24 ///rayCast vehicle, very special constraint that turn a rigidbody into a vehicle.
25 class btRaycastVehicle : public btActionInterface
28 btAlignedObjectArray<btVector3> m_forwardWS;
29 btAlignedObjectArray<btVector3> m_axle;
30 btAlignedObjectArray<btScalar> m_forwardImpulse;
31 btAlignedObjectArray<btScalar> m_sideImpulse;
33 ///backwards compatibility
34 int m_userConstraintType;
35 int m_userConstraintId;
43 :m_suspensionStiffness(btScalar(5.88)),
44 m_suspensionCompression(btScalar(0.83)),
45 m_suspensionDamping(btScalar(0.88)),
46 m_maxSuspensionTravelCm(btScalar(500.)),
47 m_frictionSlip(btScalar(10.5)),
48 m_maxSuspensionForce(btScalar(6000.))
51 btScalar m_suspensionStiffness;
52 btScalar m_suspensionCompression;
53 btScalar m_suspensionDamping;
54 btScalar m_maxSuspensionTravelCm;
55 btScalar m_frictionSlip;
56 btScalar m_maxSuspensionForce;
63 btVehicleRaycaster* m_vehicleRaycaster;
64 btScalar m_pitchControl;
65 btScalar m_steeringValue;
66 btScalar m_currentVehicleSpeedKmHour;
68 btRigidBody* m_chassisBody;
72 int m_indexForwardAxis;
74 void defaultInit(const btVehicleTuning& tuning);
78 //constructor to create a car from an existing rigidbody
79 btRaycastVehicle(const btVehicleTuning& tuning,btRigidBody* chassis, btVehicleRaycaster* raycaster );
81 virtual ~btRaycastVehicle() ;
84 ///btActionInterface interface
85 virtual void updateAction( btCollisionWorld* collisionWorld, btScalar step)
87 (void) collisionWorld;
92 ///btActionInterface interface
93 void debugDraw(btIDebugDraw* debugDrawer);
95 const btTransform& getChassisWorldTransform() const;
97 btScalar rayCast(btWheelInfo& wheel);
99 virtual void updateVehicle(btScalar step);
102 void resetSuspension();
104 btScalar getSteeringValue(int wheel) const;
106 void setSteeringValue(btScalar steering,int wheel);
109 void applyEngineForce(btScalar force, int wheel);
111 const btTransform& getWheelTransformWS( int wheelIndex ) const;
113 void updateWheelTransform( int wheelIndex, bool interpolatedTransform = true );
115 // void setRaycastWheelInfo( int wheelIndex , bool isInContact, const btVector3& hitPoint, const btVector3& hitNormal,btScalar depth);
117 btWheelInfo& addWheel( const btVector3& connectionPointCS0, const btVector3& wheelDirectionCS0,const btVector3& wheelAxleCS,btScalar suspensionRestLength,btScalar wheelRadius,const btVehicleTuning& tuning, bool isFrontWheel);
119 inline int getNumWheels() const {
120 return int (m_wheelInfo.size());
123 btAlignedObjectArray<btWheelInfo> m_wheelInfo;
126 const btWheelInfo& getWheelInfo(int index) const;
128 btWheelInfo& getWheelInfo(int index);
130 void updateWheelTransformsWS(btWheelInfo& wheel , bool interpolatedTransform = true);
133 void setBrake(btScalar brake,int wheelIndex);
135 void setPitchControl(btScalar pitch)
137 m_pitchControl = pitch;
140 void updateSuspension(btScalar deltaTime);
142 virtual void updateFriction(btScalar timeStep);
146 inline btRigidBody* getRigidBody()
148 return m_chassisBody;
151 const btRigidBody* getRigidBody() const
153 return m_chassisBody;
156 inline int getRightAxis() const
158 return m_indexRightAxis;
160 inline int getUpAxis() const
162 return m_indexUpAxis;
165 inline int getForwardAxis() const
167 return m_indexForwardAxis;
171 ///Worldspace forward vector
172 btVector3 getForwardVector() const
174 const btTransform& chassisTrans = getChassisWorldTransform();
177 chassisTrans.getBasis()[0][m_indexForwardAxis],
178 chassisTrans.getBasis()[1][m_indexForwardAxis],
179 chassisTrans.getBasis()[2][m_indexForwardAxis]);
184 ///Velocity of vehicle (positive if velocity vector has same direction as foward vector)
185 btScalar getCurrentSpeedKmHour() const
187 return m_currentVehicleSpeedKmHour;
190 virtual void setCoordinateSystem(int rightIndex,int upIndex,int forwardIndex)
192 m_indexRightAxis = rightIndex;
193 m_indexUpAxis = upIndex;
194 m_indexForwardAxis = forwardIndex;
198 ///backwards compatibility
199 int getUserConstraintType() const
201 return m_userConstraintType ;
204 void setUserConstraintType(int userConstraintType)
206 m_userConstraintType = userConstraintType;
209 void setUserConstraintId(int uid)
211 m_userConstraintId = uid;
214 int getUserConstraintId() const
216 return m_userConstraintId;
221 class btDefaultVehicleRaycaster : public btVehicleRaycaster
223 btDynamicsWorld* m_dynamicsWorld;
225 btDefaultVehicleRaycaster(btDynamicsWorld* world)
226 :m_dynamicsWorld(world)
230 virtual void* castRay(const btVector3& from,const btVector3& to, btVehicleRaycasterResult& result);
235 #endif //BT_RAYCASTVEHICLE_H