Allow setting up axis on kinematic character controller
This commit is contained in:
@@ -22,6 +22,8 @@ subject to the following restrictions:
|
|||||||
#include "LinearMath/btDefaultMotionState.h"
|
#include "LinearMath/btDefaultMotionState.h"
|
||||||
#include "btKinematicCharacterController.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,
|
///@todo Interact with dynamic objects,
|
||||||
///Ride kinematicly animated platforms properly
|
///Ride kinematicly animated platforms properly
|
||||||
///More realistic (or maybe just a config option) falling
|
///More realistic (or maybe just a config option) falling
|
||||||
@@ -93,23 +95,22 @@ btVector3 btKinematicCharacterController::perpindicularComponent (const btVector
|
|||||||
return direction - parallelComponent(direction, normal);
|
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_addedMargin = 0.02f;
|
||||||
m_walkDirection.setValue(0,0,0);
|
m_walkDirection.setValue(0,0,0);
|
||||||
m_useGhostObjectSweepTest = true;
|
m_useGhostObjectSweepTest = true;
|
||||||
m_ghostObject = ghostObject;
|
m_ghostObject = ghostObject;
|
||||||
m_stepHeight = stepHeight;
|
m_stepHeight = stepHeight;
|
||||||
m_turnAngle = btScalar(0.0);
|
m_turnAngle = btScalar(0.0);
|
||||||
m_convexShape=convexShape;
|
m_convexShape=convexShape;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
btKinematicCharacterController::~btKinematicCharacterController ()
|
btKinematicCharacterController::~btKinematicCharacterController ()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
btPairCachingGhostObject* btKinematicCharacterController::getGhostObject()
|
btPairCachingGhostObject* btKinematicCharacterController::getGhostObject()
|
||||||
{
|
{
|
||||||
return m_ghostObject;
|
return m_ghostObject;
|
||||||
@@ -172,13 +173,13 @@ void btKinematicCharacterController::stepUp ( btCollisionWorld* world)
|
|||||||
{
|
{
|
||||||
// phase 1: up
|
// phase 1: up
|
||||||
btTransform start, end;
|
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 ();
|
start.setIdentity ();
|
||||||
end.setIdentity ();
|
end.setIdentity ();
|
||||||
|
|
||||||
/* FIXME: Handle penetration properly */
|
/* 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);
|
end.setOrigin (m_targetPosition);
|
||||||
|
|
||||||
btKinematicClosestNotMeConvexResultCallback callback (m_ghostObject);
|
btKinematicClosestNotMeConvexResultCallback callback (m_ghostObject);
|
||||||
@@ -343,8 +344,8 @@ void btKinematicCharacterController::stepDown ( btCollisionWorld* collisionWorld
|
|||||||
btTransform start, end;
|
btTransform start, end;
|
||||||
|
|
||||||
// phase 3: down
|
// phase 3: down
|
||||||
btVector3 step_drop = btVector3(btScalar(0.0), m_currentStepOffset, btScalar(0.0));
|
btVector3 step_drop = upAxisDirection[m_upAxis] * m_currentStepOffset;
|
||||||
btVector3 gravity_drop = btVector3(btScalar(0.0), m_stepHeight, btScalar(0.0));
|
btVector3 gravity_drop = upAxisDirection[m_upAxis] * m_stepHeight;
|
||||||
m_targetPosition -= (step_drop + gravity_drop);
|
m_targetPosition -= (step_drop + gravity_drop);
|
||||||
|
|
||||||
start.setIdentity ();
|
start.setIdentity ();
|
||||||
|
|||||||
@@ -62,6 +62,8 @@ protected:
|
|||||||
btVector3 m_touchingNormal;
|
btVector3 m_touchingNormal;
|
||||||
|
|
||||||
bool m_useGhostObjectSweepTest;
|
bool m_useGhostObjectSweepTest;
|
||||||
|
|
||||||
|
int m_upAxis;
|
||||||
|
|
||||||
btVector3 computeReflectionDirection (const btVector3& direction, const btVector3& normal);
|
btVector3 computeReflectionDirection (const btVector3& direction, const btVector3& normal);
|
||||||
btVector3 parallelComponent (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 stepForwardAndStrafe (btCollisionWorld* collisionWorld, const btVector3& walkMove);
|
||||||
void stepDown (btCollisionWorld* collisionWorld, btScalar dt);
|
void stepDown (btCollisionWorld* collisionWorld, btScalar dt);
|
||||||
public:
|
public:
|
||||||
btKinematicCharacterController (btPairCachingGhostObject* ghostObject,btConvexShape* convexShape,btScalar stepHeight);
|
btKinematicCharacterController (btPairCachingGhostObject* ghostObject,btConvexShape* convexShape,btScalar stepHeight, int upAxis = 1);
|
||||||
~btKinematicCharacterController ();
|
~btKinematicCharacterController ();
|
||||||
|
|
||||||
|
void setUpAxis (int axis)
|
||||||
|
{
|
||||||
|
if (axis < 0)
|
||||||
|
axis = 0;
|
||||||
|
if (axis > 2)
|
||||||
|
axis = 2;
|
||||||
|
m_upAxis = axis;
|
||||||
|
}
|
||||||
|
|
||||||
virtual void setWalkDirection(const btVector3& walkDirection)
|
virtual void setWalkDirection(const btVector3& walkDirection)
|
||||||
{
|
{
|
||||||
m_walkDirection = walkDirection;
|
m_walkDirection = walkDirection;
|
||||||
|
|||||||
Reference in New Issue
Block a user