• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
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"
21 
22 //class btVehicleTuning;
23 
24 ///rayCast vehicle, very special constraint that turn a rigidbody into a vehicle.
25 class btRaycastVehicle : public btActionInterface
26 {
27 
28 		btAlignedObjectArray<btVector3>	m_forwardWS;
29 		btAlignedObjectArray<btVector3>	m_axle;
30 		btAlignedObjectArray<btScalar>	m_forwardImpulse;
31 		btAlignedObjectArray<btScalar>	m_sideImpulse;
32 
33 		///backwards compatibility
34 		int	m_userConstraintType;
35 		int	m_userConstraintId;
36 
37 public:
38 	class btVehicleTuning
39 		{
40 			public:
41 
btVehicleTuning()42 			btVehicleTuning()
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.))
49 			{
50 			}
51 			btScalar	m_suspensionStiffness;
52 			btScalar	m_suspensionCompression;
53 			btScalar	m_suspensionDamping;
54 			btScalar	m_maxSuspensionTravelCm;
55 			btScalar	m_frictionSlip;
56 			btScalar	m_maxSuspensionForce;
57 
58 		};
59 private:
60 
61 	btScalar	m_tau;
62 	btScalar	m_damping;
63 	btVehicleRaycaster*	m_vehicleRaycaster;
64 	btScalar		m_pitchControl;
65 	btScalar	m_steeringValue;
66 	btScalar m_currentVehicleSpeedKmHour;
67 
68 	btRigidBody* m_chassisBody;
69 
70 	int m_indexRightAxis;
71 	int m_indexUpAxis;
72 	int	m_indexForwardAxis;
73 
74 	void defaultInit(const btVehicleTuning& tuning);
75 
76 public:
77 
78 	//constructor to create a car from an existing rigidbody
79 	btRaycastVehicle(const btVehicleTuning& tuning,btRigidBody* chassis,	btVehicleRaycaster* raycaster );
80 
81 	virtual ~btRaycastVehicle() ;
82 
83 
84 	///btActionInterface interface
updateAction(btCollisionWorld * collisionWorld,btScalar step)85 	virtual void updateAction( btCollisionWorld* collisionWorld, btScalar step)
86 	{
87         (void) collisionWorld;
88 		updateVehicle(step);
89 	}
90 
91 
92 	///btActionInterface interface
93 	void	debugDraw(btIDebugDraw* debugDrawer);
94 
95 	const btTransform& getChassisWorldTransform() const;
96 
97 	btScalar rayCast(btWheelInfo& wheel);
98 
99 	virtual void updateVehicle(btScalar step);
100 
101 
102 	void resetSuspension();
103 
104 	btScalar	getSteeringValue(int wheel) const;
105 
106 	void	setSteeringValue(btScalar steering,int wheel);
107 
108 
109 	void	applyEngineForce(btScalar force, int wheel);
110 
111 	const btTransform&	getWheelTransformWS( int wheelIndex ) const;
112 
113 	void	updateWheelTransform( int wheelIndex, bool interpolatedTransform = true );
114 
115 //	void	setRaycastWheelInfo( int wheelIndex , bool isInContact, const btVector3& hitPoint, const btVector3& hitNormal,btScalar depth);
116 
117 	btWheelInfo&	addWheel( const btVector3& connectionPointCS0, const btVector3& wheelDirectionCS0,const btVector3& wheelAxleCS,btScalar suspensionRestLength,btScalar wheelRadius,const btVehicleTuning& tuning, bool isFrontWheel);
118 
getNumWheels()119 	inline int		getNumWheels() const {
120 		return int (m_wheelInfo.size());
121 	}
122 
123 	btAlignedObjectArray<btWheelInfo>	m_wheelInfo;
124 
125 
126 	const btWheelInfo&	getWheelInfo(int index) const;
127 
128 	btWheelInfo&	getWheelInfo(int index);
129 
130 	void	updateWheelTransformsWS(btWheelInfo& wheel , bool interpolatedTransform = true);
131 
132 
133 	void setBrake(btScalar brake,int wheelIndex);
134 
setPitchControl(btScalar pitch)135 	void	setPitchControl(btScalar pitch)
136 	{
137 		m_pitchControl = pitch;
138 	}
139 
140 	void	updateSuspension(btScalar deltaTime);
141 
142 	virtual void	updateFriction(btScalar	timeStep);
143 
144 
145 
getRigidBody()146 	inline btRigidBody* getRigidBody()
147 	{
148 		return m_chassisBody;
149 	}
150 
getRigidBody()151 	const btRigidBody* getRigidBody() const
152 	{
153 		return m_chassisBody;
154 	}
155 
getRightAxis()156 	inline int	getRightAxis() const
157 	{
158 		return m_indexRightAxis;
159 	}
getUpAxis()160 	inline int getUpAxis() const
161 	{
162 		return m_indexUpAxis;
163 	}
164 
getForwardAxis()165 	inline int getForwardAxis() const
166 	{
167 		return m_indexForwardAxis;
168 	}
169 
170 
171 	///Worldspace forward vector
getForwardVector()172 	btVector3 getForwardVector() const
173 	{
174 		const btTransform& chassisTrans = getChassisWorldTransform();
175 
176 		btVector3 forwardW (
177 			  chassisTrans.getBasis()[0][m_indexForwardAxis],
178 			  chassisTrans.getBasis()[1][m_indexForwardAxis],
179 			  chassisTrans.getBasis()[2][m_indexForwardAxis]);
180 
181 		return forwardW;
182 	}
183 
184 	///Velocity of vehicle (positive if velocity vector has same direction as foward vector)
getCurrentSpeedKmHour()185 	btScalar	getCurrentSpeedKmHour() const
186 	{
187 		return m_currentVehicleSpeedKmHour;
188 	}
189 
setCoordinateSystem(int rightIndex,int upIndex,int forwardIndex)190 	virtual void	setCoordinateSystem(int rightIndex,int upIndex,int forwardIndex)
191 	{
192 		m_indexRightAxis = rightIndex;
193 		m_indexUpAxis = upIndex;
194 		m_indexForwardAxis = forwardIndex;
195 	}
196 
197 
198 	///backwards compatibility
getUserConstraintType()199 	int getUserConstraintType() const
200 	{
201 		return m_userConstraintType ;
202 	}
203 
setUserConstraintType(int userConstraintType)204 	void	setUserConstraintType(int userConstraintType)
205 	{
206 		m_userConstraintType = userConstraintType;
207 	};
208 
setUserConstraintId(int uid)209 	void	setUserConstraintId(int uid)
210 	{
211 		m_userConstraintId = uid;
212 	}
213 
getUserConstraintId()214 	int getUserConstraintId() const
215 	{
216 		return m_userConstraintId;
217 	}
218 
219 };
220 
221 class btDefaultVehicleRaycaster : public btVehicleRaycaster
222 {
223 	btDynamicsWorld*	m_dynamicsWorld;
224 public:
btDefaultVehicleRaycaster(btDynamicsWorld * world)225 	btDefaultVehicleRaycaster(btDynamicsWorld* world)
226 		:m_dynamicsWorld(world)
227 	{
228 	}
229 
230 	virtual void* castRay(const btVector3& from,const btVector3& to, btVehicleRaycasterResult& result);
231 
232 };
233 
234 
235 #endif //BT_RAYCASTVEHICLE_H
236 
237