Changeset View
Changeset View
Standalone View
Standalone View
extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.h
| Show All 13 Lines | |||||
| #include "BulletDynamics/Dynamics/btRigidBody.h" | #include "BulletDynamics/Dynamics/btRigidBody.h" | ||||
| #include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" | #include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" | ||||
| #include "btVehicleRaycaster.h" | #include "btVehicleRaycaster.h" | ||||
| class btDynamicsWorld; | class btDynamicsWorld; | ||||
| #include "LinearMath/btAlignedObjectArray.h" | #include "LinearMath/btAlignedObjectArray.h" | ||||
| #include "btWheelInfo.h" | #include "btWheelInfo.h" | ||||
| #include "BulletDynamics/Dynamics/btActionInterface.h" | #include "BulletDynamics/Dynamics/btActionInterface.h" | ||||
| class btVehicleTuning; | //class btVehicleTuning; | ||||
| ///rayCast vehicle, very special constraint that turn a rigidbody into a vehicle. | ///rayCast vehicle, very special constraint that turn a rigidbody into a vehicle. | ||||
| class btRaycastVehicle : public btActionInterface | class btRaycastVehicle : public btActionInterface | ||||
| { | { | ||||
| btAlignedObjectArray<btVector3> m_forwardWS; | btAlignedObjectArray<btVector3> m_forwardWS; | ||||
| btAlignedObjectArray<btVector3> m_axle; | btAlignedObjectArray<btVector3> m_axle; | ||||
| btAlignedObjectArray<btScalar> m_forwardImpulse; | btAlignedObjectArray<btScalar> m_forwardImpulse; | ||||
| btAlignedObjectArray<btScalar> m_sideImpulse; | btAlignedObjectArray<btScalar> m_sideImpulse; | ||||
| ///backwards compatibility | ///backwards compatibility | ||||
| int m_userConstraintType; | int m_userConstraintType; | ||||
| int m_userConstraintId; | int m_userConstraintId; | ||||
| public: | public: | ||||
| class btVehicleTuning | class btVehicleTuning | ||||
| { | { | ||||
| public: | public: | ||||
| btVehicleTuning() | btVehicleTuning() | ||||
| :m_suspensionStiffness(btScalar(5.88)), | : m_suspensionStiffness(btScalar(5.88)), | ||||
| m_suspensionCompression(btScalar(0.83)), | m_suspensionCompression(btScalar(0.83)), | ||||
| m_suspensionDamping(btScalar(0.88)), | m_suspensionDamping(btScalar(0.88)), | ||||
| m_maxSuspensionTravelCm(btScalar(500.)), | m_maxSuspensionTravelCm(btScalar(500.)), | ||||
| m_frictionSlip(btScalar(10.5)), | m_frictionSlip(btScalar(10.5)), | ||||
| m_maxSuspensionForce(btScalar(6000.)) | m_maxSuspensionForce(btScalar(6000.)) | ||||
| { | { | ||||
| } | } | ||||
| btScalar m_suspensionStiffness; | btScalar m_suspensionStiffness; | ||||
| btScalar m_suspensionCompression; | btScalar m_suspensionCompression; | ||||
| btScalar m_suspensionDamping; | btScalar m_suspensionDamping; | ||||
| btScalar m_maxSuspensionTravelCm; | btScalar m_maxSuspensionTravelCm; | ||||
| btScalar m_frictionSlip; | btScalar m_frictionSlip; | ||||
| btScalar m_maxSuspensionForce; | btScalar m_maxSuspensionForce; | ||||
| }; | }; | ||||
| private: | |||||
| private: | |||||
| btVehicleRaycaster* m_vehicleRaycaster; | btVehicleRaycaster* m_vehicleRaycaster; | ||||
| btScalar m_pitchControl; | btScalar m_pitchControl; | ||||
| btScalar m_steeringValue; | btScalar m_steeringValue; | ||||
| btScalar m_currentVehicleSpeedKmHour; | btScalar m_currentVehicleSpeedKmHour; | ||||
| btRigidBody* m_chassisBody; | btRigidBody* m_chassisBody; | ||||
| int m_indexRightAxis; | int m_indexRightAxis; | ||||
| int m_indexUpAxis; | int m_indexUpAxis; | ||||
| int m_indexForwardAxis; | int m_indexForwardAxis; | ||||
| void defaultInit(const btVehicleTuning& tuning); | void defaultInit(const btVehicleTuning& tuning); | ||||
| public: | public: | ||||
| //constructor to create a car from an existing rigidbody | //constructor to create a car from an existing rigidbody | ||||
| btRaycastVehicle(const btVehicleTuning& tuning,btRigidBody* chassis, btVehicleRaycaster* raycaster ); | btRaycastVehicle(const btVehicleTuning& tuning, btRigidBody* chassis, btVehicleRaycaster* raycaster); | ||||
| virtual ~btRaycastVehicle() ; | virtual ~btRaycastVehicle(); | ||||
| ///btActionInterface interface | ///btActionInterface interface | ||||
| virtual void updateAction( btCollisionWorld* collisionWorld, btScalar step) | virtual void updateAction(btCollisionWorld* collisionWorld, btScalar step) | ||||
| { | { | ||||
| (void) collisionWorld; | (void)collisionWorld; | ||||
| updateVehicle(step); | updateVehicle(step); | ||||
| } | } | ||||
| ///btActionInterface interface | ///btActionInterface interface | ||||
| void debugDraw(btIDebugDraw* debugDrawer); | void debugDraw(btIDebugDraw* debugDrawer); | ||||
| const btTransform& getChassisWorldTransform() const; | const btTransform& getChassisWorldTransform() const; | ||||
| btScalar rayCast(btWheelInfo& wheel); | btScalar rayCast(btWheelInfo& wheel); | ||||
| virtual void updateVehicle(btScalar step); | virtual void updateVehicle(btScalar step); | ||||
| void resetSuspension(); | void resetSuspension(); | ||||
| btScalar getSteeringValue(int wheel) const; | btScalar getSteeringValue(int wheel) const; | ||||
| void setSteeringValue(btScalar steering,int wheel); | void setSteeringValue(btScalar steering, int wheel); | ||||
| void applyEngineForce(btScalar force, int wheel); | void applyEngineForce(btScalar force, int wheel); | ||||
| const btTransform& getWheelTransformWS( int wheelIndex ) const; | const btTransform& getWheelTransformWS(int wheelIndex) const; | ||||
| void updateWheelTransform( int wheelIndex, bool interpolatedTransform = true ); | void updateWheelTransform(int wheelIndex, bool interpolatedTransform = true); | ||||
| // void setRaycastWheelInfo( int wheelIndex , bool isInContact, const btVector3& hitPoint, const btVector3& hitNormal,btScalar depth); | // 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); | btWheelInfo& addWheel(const btVector3& connectionPointCS0, const btVector3& wheelDirectionCS0, const btVector3& wheelAxleCS, btScalar suspensionRestLength, btScalar wheelRadius, const btVehicleTuning& tuning, bool isFrontWheel); | ||||
| inline int getNumWheels() const { | inline int getNumWheels() const | ||||
| { | |||||
| return int (m_wheelInfo.size()); | return int(m_wheelInfo.size()); | ||||
| } | } | ||||
| btAlignedObjectArray<btWheelInfo> m_wheelInfo; | btAlignedObjectArray<btWheelInfo> m_wheelInfo; | ||||
| const btWheelInfo& getWheelInfo(int index) const; | const btWheelInfo& getWheelInfo(int index) const; | ||||
| btWheelInfo& getWheelInfo(int index); | btWheelInfo& getWheelInfo(int index); | ||||
| void updateWheelTransformsWS(btWheelInfo& wheel , bool interpolatedTransform = true); | void updateWheelTransformsWS(btWheelInfo& wheel, bool interpolatedTransform = true); | ||||
| void setBrake(btScalar brake,int wheelIndex); | void setBrake(btScalar brake, int wheelIndex); | ||||
| void setPitchControl(btScalar pitch) | void setPitchControl(btScalar pitch) | ||||
| { | { | ||||
| m_pitchControl = pitch; | m_pitchControl = pitch; | ||||
| } | } | ||||
| void updateSuspension(btScalar deltaTime); | void updateSuspension(btScalar deltaTime); | ||||
| virtual void updateFriction(btScalar timeStep); | virtual void updateFriction(btScalar timeStep); | ||||
| inline btRigidBody* getRigidBody() | inline btRigidBody* getRigidBody() | ||||
| { | { | ||||
| return m_chassisBody; | return m_chassisBody; | ||||
| } | } | ||||
| const btRigidBody* getRigidBody() const | const btRigidBody* getRigidBody() const | ||||
| { | { | ||||
| return m_chassisBody; | return m_chassisBody; | ||||
| } | } | ||||
| inline int getRightAxis() const | inline int getRightAxis() const | ||||
| { | { | ||||
| return m_indexRightAxis; | return m_indexRightAxis; | ||||
| } | } | ||||
| inline int getUpAxis() const | inline int getUpAxis() const | ||||
| { | { | ||||
| return m_indexUpAxis; | return m_indexUpAxis; | ||||
| } | } | ||||
| inline int getForwardAxis() const | inline int getForwardAxis() const | ||||
| { | { | ||||
| return m_indexForwardAxis; | return m_indexForwardAxis; | ||||
| } | } | ||||
| ///Worldspace forward vector | ///Worldspace forward vector | ||||
| btVector3 getForwardVector() const | btVector3 getForwardVector() const | ||||
| { | { | ||||
| const btTransform& chassisTrans = getChassisWorldTransform(); | const btTransform& chassisTrans = getChassisWorldTransform(); | ||||
| btVector3 forwardW ( | btVector3 forwardW( | ||||
| chassisTrans.getBasis()[0][m_indexForwardAxis], | chassisTrans.getBasis()[0][m_indexForwardAxis], | ||||
| chassisTrans.getBasis()[1][m_indexForwardAxis], | chassisTrans.getBasis()[1][m_indexForwardAxis], | ||||
| chassisTrans.getBasis()[2][m_indexForwardAxis]); | chassisTrans.getBasis()[2][m_indexForwardAxis]); | ||||
| return forwardW; | return forwardW; | ||||
| } | } | ||||
| ///Velocity of vehicle (positive if velocity vector has same direction as foward vector) | ///Velocity of vehicle (positive if velocity vector has same direction as foward vector) | ||||
| btScalar getCurrentSpeedKmHour() const | btScalar getCurrentSpeedKmHour() const | ||||
| { | { | ||||
| return m_currentVehicleSpeedKmHour; | return m_currentVehicleSpeedKmHour; | ||||
| } | } | ||||
| virtual void setCoordinateSystem(int rightIndex,int upIndex,int forwardIndex) | virtual void setCoordinateSystem(int rightIndex, int upIndex, int forwardIndex) | ||||
| { | { | ||||
| m_indexRightAxis = rightIndex; | m_indexRightAxis = rightIndex; | ||||
| m_indexUpAxis = upIndex; | m_indexUpAxis = upIndex; | ||||
| m_indexForwardAxis = forwardIndex; | m_indexForwardAxis = forwardIndex; | ||||
| } | } | ||||
| ///backwards compatibility | ///backwards compatibility | ||||
| int getUserConstraintType() const | int getUserConstraintType() const | ||||
| { | { | ||||
| return m_userConstraintType ; | return m_userConstraintType; | ||||
| } | } | ||||
| void setUserConstraintType(int userConstraintType) | void setUserConstraintType(int userConstraintType) | ||||
| { | { | ||||
| m_userConstraintType = userConstraintType; | m_userConstraintType = userConstraintType; | ||||
| }; | }; | ||||
| void setUserConstraintId(int uid) | void setUserConstraintId(int uid) | ||||
| { | { | ||||
| m_userConstraintId = uid; | m_userConstraintId = uid; | ||||
| } | } | ||||
| int getUserConstraintId() const | int getUserConstraintId() const | ||||
| { | { | ||||
| return m_userConstraintId; | return m_userConstraintId; | ||||
| } | } | ||||
| }; | }; | ||||
| class btDefaultVehicleRaycaster : public btVehicleRaycaster | class btDefaultVehicleRaycaster : public btVehicleRaycaster | ||||
| { | { | ||||
| btDynamicsWorld* m_dynamicsWorld; | btDynamicsWorld* m_dynamicsWorld; | ||||
| public: | public: | ||||
| btDefaultVehicleRaycaster(btDynamicsWorld* world) | btDefaultVehicleRaycaster(btDynamicsWorld* world) | ||||
| :m_dynamicsWorld(world) | : m_dynamicsWorld(world) | ||||
| { | { | ||||
| } | } | ||||
| virtual void* castRay(const btVector3& from,const btVector3& to, btVehicleRaycasterResult& result); | virtual void* castRay(const btVector3& from, const btVector3& to, btVehicleRaycasterResult& result); | ||||
| }; | }; | ||||
| #endif //BT_RAYCASTVEHICLE_H | #endif //BT_RAYCASTVEHICLE_H | ||||