diff --git a/src/BulletDynamics/Character/btKinematicCharacterController.cpp b/src/BulletDynamics/Character/btKinematicCharacterController.cpp index 17cc533af..b8ef59b7c 100644 --- a/src/BulletDynamics/Character/btKinematicCharacterController.cpp +++ b/src/BulletDynamics/Character/btKinematicCharacterController.cpp @@ -22,6 +22,8 @@ subject to the following restrictions: #include "LinearMath/btDefaultMotionState.h" #include "btKinematicCharacterController.h" +static btVector3 upAxisDirection[3] = { btVector3(1.0f, 0.0f, 0.0f), btVector3(0.0f, 1.0f, 0.0f), btVector3(0.0f, 0.0f, 1.0f) }; + ///@todo Interact with dynamic objects, ///Ride kinematicly animated platforms properly ///More realistic (or maybe just a config option) falling @@ -93,23 +95,22 @@ btVector3 btKinematicCharacterController::perpindicularComponent (const btVector return direction - parallelComponent(direction, normal); } -btKinematicCharacterController::btKinematicCharacterController (btPairCachingGhostObject* ghostObject,btConvexShape* convexShape,btScalar stepHeight) +btKinematicCharacterController::btKinematicCharacterController (btPairCachingGhostObject* ghostObject,btConvexShape* convexShape,btScalar stepHeight, int upAxis) { + m_upAxis = upAxis; m_addedMargin = 0.02f; m_walkDirection.setValue(0,0,0); m_useGhostObjectSweepTest = true; m_ghostObject = ghostObject; m_stepHeight = stepHeight; m_turnAngle = btScalar(0.0); - m_convexShape=convexShape; - + m_convexShape=convexShape; } btKinematicCharacterController::~btKinematicCharacterController () { } - btPairCachingGhostObject* btKinematicCharacterController::getGhostObject() { return m_ghostObject; @@ -172,13 +173,13 @@ void btKinematicCharacterController::stepUp ( btCollisionWorld* world) { // phase 1: up btTransform start, end; - m_targetPosition = m_currentPosition + btVector3 (btScalar(0.0), m_stepHeight, btScalar(0.0)); + m_targetPosition = m_currentPosition + upAxisDirection[m_upAxis] * m_stepHeight; start.setIdentity (); end.setIdentity (); /* FIXME: Handle penetration properly */ - start.setOrigin (m_currentPosition + btVector3(btScalar(0.0), btScalar(0.1), btScalar(0.0))); + start.setOrigin (m_currentPosition + upAxisDirection[m_upAxis] * btScalar(0.1f)); end.setOrigin (m_targetPosition); btKinematicClosestNotMeConvexResultCallback callback (m_ghostObject); @@ -343,8 +344,8 @@ void btKinematicCharacterController::stepDown ( btCollisionWorld* collisionWorld btTransform start, end; // phase 3: down - btVector3 step_drop = btVector3(btScalar(0.0), m_currentStepOffset, btScalar(0.0)); - btVector3 gravity_drop = btVector3(btScalar(0.0), m_stepHeight, btScalar(0.0)); + btVector3 step_drop = upAxisDirection[m_upAxis] * m_currentStepOffset; + btVector3 gravity_drop = upAxisDirection[m_upAxis] * m_stepHeight; m_targetPosition -= (step_drop + gravity_drop); start.setIdentity (); diff --git a/src/BulletDynamics/Character/btKinematicCharacterController.h b/src/BulletDynamics/Character/btKinematicCharacterController.h index 6d9aa09fb..8489e4f7c 100644 --- a/src/BulletDynamics/Character/btKinematicCharacterController.h +++ b/src/BulletDynamics/Character/btKinematicCharacterController.h @@ -62,6 +62,8 @@ protected: btVector3 m_touchingNormal; bool m_useGhostObjectSweepTest; + + int m_upAxis; btVector3 computeReflectionDirection (const btVector3& direction, const btVector3& normal); btVector3 parallelComponent (const btVector3& direction, const btVector3& normal); @@ -73,9 +75,18 @@ protected: void stepForwardAndStrafe (btCollisionWorld* collisionWorld, const btVector3& walkMove); void stepDown (btCollisionWorld* collisionWorld, btScalar dt); public: - btKinematicCharacterController (btPairCachingGhostObject* ghostObject,btConvexShape* convexShape,btScalar stepHeight); + btKinematicCharacterController (btPairCachingGhostObject* ghostObject,btConvexShape* convexShape,btScalar stepHeight, int upAxis = 1); ~btKinematicCharacterController (); + void setUpAxis (int axis) + { + if (axis < 0) + axis = 0; + if (axis > 2) + axis = 2; + m_upAxis = axis; + } + virtual void setWalkDirection(const btVector3& walkDirection) { m_walkDirection = walkDirection;