123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- /*
- * Copyright (c) 2005 Erwin Coumans https://bulletphysics.org
- *
- * 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
|