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
 | 
						|
 |