235 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			235 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /*
 | ||
|  |  * Copyright (c) 2005 Erwin Coumans http://continuousphysics.com/Bullet/
 | ||
|  |  * | ||
|  |  * Permission to use, copy, modify, distribute and sell this software | ||
|  |  * and its documentation for any purpose is hereby granted without fee, | ||
|  |  * provided that the above copyright notice appear in all copies. | ||
|  |  * Erwin Coumans makes no representations about the suitability  | ||
|  |  * of this software for any purpose.   | ||
|  |  * It is provided "as is" without express or implied warranty. | ||
|  | */ | ||
|  | #ifndef BT_RAYCASTVEHICLE_H
 | ||
|  | #define BT_RAYCASTVEHICLE_H
 | ||
|  | 
 | ||
|  | #include "BulletDynamics/Dynamics/btRigidBody.h"
 | ||
|  | #include "BulletDynamics/ConstraintSolver/btTypedConstraint.h"
 | ||
|  | #include "btVehicleRaycaster.h"
 | ||
|  | class btDynamicsWorld; | ||
|  | #include "LinearMath/btAlignedObjectArray.h"
 | ||
|  | #include "btWheelInfo.h"
 | ||
|  | #include "BulletDynamics/Dynamics/btActionInterface.h"
 | ||
|  | 
 | ||
|  | //class btVehicleTuning;
 | ||
|  | 
 | ||
|  | ///rayCast vehicle, very special constraint that turn a rigidbody into a vehicle.
 | ||
|  | class btRaycastVehicle : public btActionInterface | ||
|  | { | ||
|  | 
 | ||
|  | 		btAlignedObjectArray<btVector3>	m_forwardWS; | ||
|  | 		btAlignedObjectArray<btVector3>	m_axle; | ||
|  | 		btAlignedObjectArray<btScalar>	m_forwardImpulse; | ||
|  | 		btAlignedObjectArray<btScalar>	m_sideImpulse; | ||
|  | 	 | ||
|  | 		///backwards compatibility
 | ||
|  | 		int	m_userConstraintType; | ||
|  | 		int	m_userConstraintId; | ||
|  | 
 | ||
|  | public: | ||
|  | 	class btVehicleTuning | ||
|  | 		{ | ||
|  | 			public: | ||
|  | 
 | ||
|  | 			btVehicleTuning() | ||
|  | 				:m_suspensionStiffness(btScalar(5.88)), | ||
|  | 				m_suspensionCompression(btScalar(0.83)), | ||
|  | 				m_suspensionDamping(btScalar(0.88)), | ||
|  | 				m_maxSuspensionTravelCm(btScalar(500.)), | ||
|  | 				m_frictionSlip(btScalar(10.5)), | ||
|  | 				m_maxSuspensionForce(btScalar(6000.)) | ||
|  | 			{ | ||
|  | 			} | ||
|  | 			btScalar	m_suspensionStiffness; | ||
|  | 			btScalar	m_suspensionCompression; | ||
|  | 			btScalar	m_suspensionDamping; | ||
|  | 			btScalar	m_maxSuspensionTravelCm; | ||
|  | 			btScalar	m_frictionSlip; | ||
|  | 			btScalar	m_maxSuspensionForce; | ||
|  | 
 | ||
|  | 		}; | ||
|  | private: | ||
|  | 
 | ||
|  | 	btVehicleRaycaster*	m_vehicleRaycaster; | ||
|  | 	btScalar		m_pitchControl; | ||
|  | 	btScalar	m_steeringValue;  | ||
|  | 	btScalar m_currentVehicleSpeedKmHour; | ||
|  | 
 | ||
|  | 	btRigidBody* m_chassisBody; | ||
|  | 
 | ||
|  | 	int m_indexRightAxis; | ||
|  | 	int m_indexUpAxis; | ||
|  | 	int	m_indexForwardAxis; | ||
|  | 
 | ||
|  | 	void defaultInit(const btVehicleTuning& tuning); | ||
|  | 
 | ||
|  | public: | ||
|  | 
 | ||
|  | 	//constructor to create a car from an existing rigidbody
 | ||
|  | 	btRaycastVehicle(const btVehicleTuning& tuning,btRigidBody* chassis,	btVehicleRaycaster* raycaster ); | ||
|  | 
 | ||
|  | 	virtual ~btRaycastVehicle() ; | ||
|  | 
 | ||
|  | 
 | ||
|  | 	///btActionInterface interface
 | ||
|  | 	virtual void updateAction( btCollisionWorld* collisionWorld, btScalar step) | ||
|  | 	{ | ||
|  |         (void) collisionWorld; | ||
|  | 		updateVehicle(step); | ||
|  | 	} | ||
|  | 	 | ||
|  | 
 | ||
|  | 	///btActionInterface interface
 | ||
|  | 	void	debugDraw(btIDebugDraw* debugDrawer); | ||
|  | 			 | ||
|  | 	const btTransform& getChassisWorldTransform() const; | ||
|  | 	 | ||
|  | 	btScalar rayCast(btWheelInfo& wheel); | ||
|  | 
 | ||
|  | 	virtual void updateVehicle(btScalar step); | ||
|  | 	 | ||
|  | 	 | ||
|  | 	void resetSuspension(); | ||
|  | 
 | ||
|  | 	btScalar	getSteeringValue(int wheel) const; | ||
|  | 
 | ||
|  | 	void	setSteeringValue(btScalar steering,int wheel); | ||
|  | 
 | ||
|  | 
 | ||
|  | 	void	applyEngineForce(btScalar force, int wheel); | ||
|  | 
 | ||
|  | 	const btTransform&	getWheelTransformWS( int wheelIndex ) const; | ||
|  | 
 | ||
|  | 	void	updateWheelTransform( int wheelIndex, bool interpolatedTransform = true ); | ||
|  | 	 | ||
|  | //	void	setRaycastWheelInfo( int wheelIndex , bool isInContact, const btVector3& hitPoint, const btVector3& hitNormal,btScalar depth);
 | ||
|  | 
 | ||
|  | 	btWheelInfo&	addWheel( const btVector3& connectionPointCS0, const btVector3& wheelDirectionCS0,const btVector3& wheelAxleCS,btScalar suspensionRestLength,btScalar wheelRadius,const btVehicleTuning& tuning, bool isFrontWheel); | ||
|  | 
 | ||
|  | 	inline int		getNumWheels() const { | ||
|  | 		return int (m_wheelInfo.size()); | ||
|  | 	} | ||
|  | 	 | ||
|  | 	btAlignedObjectArray<btWheelInfo>	m_wheelInfo; | ||
|  | 
 | ||
|  | 
 | ||
|  | 	const btWheelInfo&	getWheelInfo(int index) const; | ||
|  | 
 | ||
|  | 	btWheelInfo&	getWheelInfo(int index); | ||
|  | 
 | ||
|  | 	void	updateWheelTransformsWS(btWheelInfo& wheel , bool interpolatedTransform = true); | ||
|  | 
 | ||
|  | 	 | ||
|  | 	void setBrake(btScalar brake,int wheelIndex); | ||
|  | 
 | ||
|  | 	void	setPitchControl(btScalar pitch) | ||
|  | 	{ | ||
|  | 		m_pitchControl = pitch; | ||
|  | 	} | ||
|  | 	 | ||
|  | 	void	updateSuspension(btScalar deltaTime); | ||
|  | 
 | ||
|  | 	virtual void	updateFriction(btScalar	timeStep); | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 	inline btRigidBody* getRigidBody() | ||
|  | 	{ | ||
|  | 		return m_chassisBody; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	const btRigidBody* getRigidBody() const | ||
|  | 	{ | ||
|  | 		return m_chassisBody; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	inline int	getRightAxis() const | ||
|  | 	{ | ||
|  | 		return m_indexRightAxis; | ||
|  | 	} | ||
|  | 	inline int getUpAxis() const | ||
|  | 	{ | ||
|  | 		return m_indexUpAxis; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	inline int getForwardAxis() const | ||
|  | 	{ | ||
|  | 		return m_indexForwardAxis; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	 | ||
|  | 	///Worldspace forward vector
 | ||
|  | 	btVector3 getForwardVector() const | ||
|  | 	{ | ||
|  | 		const btTransform& chassisTrans = getChassisWorldTransform();  | ||
|  | 
 | ||
|  | 		btVector3 forwardW (  | ||
|  | 			  chassisTrans.getBasis()[0][m_indexForwardAxis],  | ||
|  | 			  chassisTrans.getBasis()[1][m_indexForwardAxis],  | ||
|  | 			  chassisTrans.getBasis()[2][m_indexForwardAxis]);  | ||
|  | 
 | ||
|  | 		return forwardW; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	///Velocity of vehicle (positive if velocity vector has same direction as foward vector)
 | ||
|  | 	btScalar	getCurrentSpeedKmHour() const | ||
|  | 	{ | ||
|  | 		return m_currentVehicleSpeedKmHour; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	virtual void	setCoordinateSystem(int rightIndex,int upIndex,int forwardIndex) | ||
|  | 	{ | ||
|  | 		m_indexRightAxis = rightIndex; | ||
|  | 		m_indexUpAxis = upIndex; | ||
|  | 		m_indexForwardAxis = forwardIndex; | ||
|  | 	} | ||
|  | 
 | ||
|  | 
 | ||
|  | 	///backwards compatibility
 | ||
|  | 	int getUserConstraintType() const | ||
|  | 	{ | ||
|  | 		return m_userConstraintType ; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	void	setUserConstraintType(int userConstraintType) | ||
|  | 	{ | ||
|  | 		m_userConstraintType = userConstraintType; | ||
|  | 	}; | ||
|  | 
 | ||
|  | 	void	setUserConstraintId(int uid) | ||
|  | 	{ | ||
|  | 		m_userConstraintId = uid; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	int getUserConstraintId() const | ||
|  | 	{ | ||
|  | 		return m_userConstraintId; | ||
|  | 	} | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | class btDefaultVehicleRaycaster : public btVehicleRaycaster | ||
|  | { | ||
|  | 	btDynamicsWorld*	m_dynamicsWorld; | ||
|  | public: | ||
|  | 	btDefaultVehicleRaycaster(btDynamicsWorld* world) | ||
|  | 		:m_dynamicsWorld(world) | ||
|  | 	{ | ||
|  | 	} | ||
|  | 
 | ||
|  | 	virtual void* castRay(const btVector3& from,const btVector3& to, btVehicleRaycasterResult& result); | ||
|  | 
 | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif //BT_RAYCASTVEHICLE_H
 | ||
|  | 
 |