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