use a btCollisionWorld instead of btDynamicsWorld, thanks reltham for the feedback
http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=2317&p=9197#p9197
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
class btCollisionShape;
|
class btCollisionShape;
|
||||||
class btRigidBody;
|
class btRigidBody;
|
||||||
class btDynamicsWorld;
|
class btCollisionWorld;
|
||||||
|
|
||||||
class CharacterControllerInterface
|
class CharacterControllerInterface
|
||||||
{
|
{
|
||||||
@@ -20,8 +20,8 @@ public:
|
|||||||
virtual void reset () = 0;
|
virtual void reset () = 0;
|
||||||
virtual void warp (const btVector3& origin) = 0;
|
virtual void warp (const btVector3& origin) = 0;
|
||||||
virtual void registerPairCacheAndDispatcher (btOverlappingPairCache* pairCache, btCollisionDispatcher* dispatcher)=0;
|
virtual void registerPairCacheAndDispatcher (btOverlappingPairCache* pairCache, btCollisionDispatcher* dispatcher)=0;
|
||||||
virtual void preStep (const btDynamicsWorld* dynamicsWorld) = 0;
|
virtual void preStep (const btCollisionWorld* collisionWorld) = 0;
|
||||||
virtual void playerStep (const btDynamicsWorld* dynamicsWorld, btScalar dt,
|
virtual void playerStep (const btCollisionWorld* collisionWorld, btScalar dt,
|
||||||
int forward,
|
int forward,
|
||||||
int backward,
|
int backward,
|
||||||
int left,
|
int left,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include "BulletCollision/CollisionShapes/btMultiSphereShape.h"
|
#include "BulletCollision/CollisionShapes/btMultiSphereShape.h"
|
||||||
#include "BulletDynamics/Dynamics/btRigidBody.h"
|
#include "BulletDynamics/Dynamics/btRigidBody.h"
|
||||||
#include "BulletDynamics/Dynamics/btDynamicsWorld.h"
|
#include "BulletCollision/CollisionDispatch/btCollisionWorld.h"
|
||||||
#include "LinearMath/btDefaultMotionState.h"
|
#include "LinearMath/btDefaultMotionState.h"
|
||||||
#include "DynamicCharacterController.h"
|
#include "DynamicCharacterController.h"
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ btCollisionObject* DynamicCharacterController::getCollisionObject ()
|
|||||||
return m_rigidBody;
|
return m_rigidBody;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DynamicCharacterController::preStep (const btDynamicsWorld* dynamicsWorld)
|
void DynamicCharacterController::preStep (const btCollisionWorld* collisionWorld)
|
||||||
{
|
{
|
||||||
btTransform xform;
|
btTransform xform;
|
||||||
m_rigidBody->getMotionState()->getWorldTransform (xform);
|
m_rigidBody->getMotionState()->getWorldTransform (xform);
|
||||||
@@ -108,7 +108,7 @@ void DynamicCharacterController::preStep (const btDynamicsWorld* dynamicsWorld)
|
|||||||
for (i = 0; i < 2; i++)
|
for (i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
rayCallback.m_closestHitFraction = 1.0;
|
rayCallback.m_closestHitFraction = 1.0;
|
||||||
dynamicsWorld->rayTest (m_raySource[i], m_rayTarget[i], rayCallback);
|
collisionWorld->rayTest (m_raySource[i], m_rayTarget[i], rayCallback);
|
||||||
if (rayCallback.HasHit())
|
if (rayCallback.HasHit())
|
||||||
{
|
{
|
||||||
m_rayLambda[i] = rayCallback.m_closestHitFraction;
|
m_rayLambda[i] = rayCallback.m_closestHitFraction;
|
||||||
@@ -118,7 +118,7 @@ void DynamicCharacterController::preStep (const btDynamicsWorld* dynamicsWorld)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DynamicCharacterController::playerStep (const btDynamicsWorld* dynaWorld,btScalar dt,
|
void DynamicCharacterController::playerStep (const btCollisionWorld* dynaWorld,btScalar dt,
|
||||||
int forward,
|
int forward,
|
||||||
int backward,
|
int backward,
|
||||||
int left,
|
int left,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
class btCollisionShape;
|
class btCollisionShape;
|
||||||
class btRigidBody;
|
class btRigidBody;
|
||||||
class btDynamicsWorld;
|
class btCollisionWorld;
|
||||||
|
|
||||||
///DynamicCharacterController is obsolete/unsupported at the moment
|
///DynamicCharacterController is obsolete/unsupported at the moment
|
||||||
class DynamicCharacterController : public CharacterControllerInterface
|
class DynamicCharacterController : public CharacterControllerInterface
|
||||||
@@ -39,8 +39,8 @@ public:
|
|||||||
|
|
||||||
btCollisionObject* getCollisionObject ();
|
btCollisionObject* getCollisionObject ();
|
||||||
|
|
||||||
void preStep (const btDynamicsWorld* dynamicsWorld);
|
void preStep (const btCollisionWorld* collisionWorld);
|
||||||
void playerStep (const btDynamicsWorld* dynaWorld,btScalar dt,
|
void playerStep (const btCollisionWorld* collisionWorld,btScalar dt,
|
||||||
int forward,
|
int forward,
|
||||||
int backward,
|
int backward,
|
||||||
int left,
|
int left,
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "GLDebugDrawer.h"
|
#include "GLDebugDrawer.h"
|
||||||
|
|
||||||
#include "BulletCollision/CollisionShapes/btMultiSphereShape.h"
|
#include "BulletCollision/CollisionShapes/btMultiSphereShape.h"
|
||||||
#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h"
|
#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h"
|
||||||
#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
|
#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
|
||||||
#include "BulletDynamics/Dynamics/btRigidBody.h"
|
#include "BulletCollision/CollisionDispatch/btCollisionWorld.h"
|
||||||
#include "BulletDynamics/Dynamics/btDynamicsWorld.h"
|
|
||||||
#include "LinearMath/btDefaultMotionState.h"
|
#include "LinearMath/btDefaultMotionState.h"
|
||||||
#include "KinematicCharacterController.h"
|
#include "KinematicCharacterController.h"
|
||||||
|
|
||||||
@@ -87,7 +85,7 @@ btVector3 perpindicularComponent (const btVector3& direction, const btVector3& n
|
|||||||
KinematicCharacterController::KinematicCharacterController ()
|
KinematicCharacterController::KinematicCharacterController ()
|
||||||
{
|
{
|
||||||
m_turnAngle = btScalar(0.0);
|
m_turnAngle = btScalar(0.0);
|
||||||
m_walkVelocity = btScalar(1.1) * 14.0; // 4 km/h -> 1.1 m/s
|
m_walkVelocity = btScalar(1.1) * 4.0; // 4 km/h -> 1.1 m/s
|
||||||
m_shape = NULL;
|
m_shape = NULL;
|
||||||
m_pairCache = NULL;
|
m_pairCache = NULL;
|
||||||
m_collisionObject = NULL;
|
m_collisionObject = NULL;
|
||||||
@@ -117,7 +115,7 @@ void KinematicCharacterController::setup (btScalar height, btScalar width, btSca
|
|||||||
startTransform.setIdentity ();
|
startTransform.setIdentity ();
|
||||||
startTransform.setOrigin (btVector3(0.0, 4.0, 0.0));
|
startTransform.setOrigin (btVector3(0.0, 4.0, 0.0));
|
||||||
//btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform);
|
//btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform);
|
||||||
//btRigidBody::btRigidBodyConstructionInfo cInfo(1.0, myMotionState, m_shape);
|
|
||||||
m_collisionObject = new btCollisionObject ();
|
m_collisionObject = new btCollisionObject ();
|
||||||
|
|
||||||
m_collisionObject->setWorldTransform(startTransform);
|
m_collisionObject->setWorldTransform(startTransform);
|
||||||
@@ -144,7 +142,7 @@ btCollisionObject* KinematicCharacterController::getCollisionObject ()
|
|||||||
return m_collisionObject;
|
return m_collisionObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KinematicCharacterController::recoverFromPenetration (const btDynamicsWorld* dynamicsWorld)
|
bool KinematicCharacterController::recoverFromPenetration (const btCollisionWorld* collisionWorld)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (m_pairCache == NULL)
|
if (m_pairCache == NULL)
|
||||||
@@ -153,7 +151,7 @@ bool KinematicCharacterController::recoverFromPenetration (const btDynamicsWorld
|
|||||||
bool penetration = false;
|
bool penetration = false;
|
||||||
|
|
||||||
|
|
||||||
m_dispatcher->dispatchAllCollisionPairs (m_pairCache, dynamicsWorld->getDispatchInfo(), m_dispatcher);
|
m_dispatcher->dispatchAllCollisionPairs (m_pairCache, collisionWorld->getDispatchInfo(), m_dispatcher);
|
||||||
|
|
||||||
m_currentPosition = m_collisionObject->getWorldTransform().getOrigin();
|
m_currentPosition = m_collisionObject->getWorldTransform().getOrigin();
|
||||||
|
|
||||||
@@ -201,7 +199,7 @@ bool KinematicCharacterController::recoverFromPenetration (const btDynamicsWorld
|
|||||||
return penetration;
|
return penetration;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KinematicCharacterController::stepUp (const btDynamicsWorld* dynamicsWorld)
|
void KinematicCharacterController::stepUp (const btCollisionWorld* world)
|
||||||
{
|
{
|
||||||
// phase 1: up
|
// phase 1: up
|
||||||
btTransform start, end;
|
btTransform start, end;
|
||||||
@@ -216,7 +214,7 @@ void KinematicCharacterController::stepUp (const btDynamicsWorld* dynamicsWorld)
|
|||||||
|
|
||||||
ClosestNotMeConvexResultCallback callback (m_collisionObject);
|
ClosestNotMeConvexResultCallback callback (m_collisionObject);
|
||||||
|
|
||||||
dynamicsWorld->convexSweepTest (m_shape, start, end, callback);
|
world->convexSweepTest (m_shape, start, end, callback);
|
||||||
|
|
||||||
if (callback.HasHit())
|
if (callback.HasHit())
|
||||||
{
|
{
|
||||||
@@ -265,7 +263,7 @@ void KinematicCharacterController::updateTargetPositionBasedOnCollision (const b
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void KinematicCharacterController::stepForwardAndStrafe (const btDynamicsWorld* dynamicsWorld, const btVector3& walkMove)
|
void KinematicCharacterController::stepForwardAndStrafe (const btCollisionWorld* collisionWorld, const btVector3& walkMove)
|
||||||
{
|
{
|
||||||
|
|
||||||
btVector3 originalDir = walkMove.normalized();
|
btVector3 originalDir = walkMove.normalized();
|
||||||
@@ -301,7 +299,7 @@ void KinematicCharacterController::stepForwardAndStrafe (const btDynamicsWorld*
|
|||||||
|
|
||||||
//btScalar margin = m_shape->getMargin();
|
//btScalar margin = m_shape->getMargin();
|
||||||
//m_shape->setMargin(margin - 0.06f);
|
//m_shape->setMargin(margin - 0.06f);
|
||||||
dynamicsWorld->convexSweepTest (m_shape, start, end, callback);
|
collisionWorld->convexSweepTest (m_shape, start, end, callback);
|
||||||
//m_shape->setMargin(margin);
|
//m_shape->setMargin(margin);
|
||||||
|
|
||||||
|
|
||||||
@@ -350,7 +348,7 @@ void KinematicCharacterController::stepForwardAndStrafe (const btDynamicsWorld*
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void KinematicCharacterController::stepDown (const btDynamicsWorld* dynamicsWorld, btScalar dt)
|
void KinematicCharacterController::stepDown (const btCollisionWorld* collisionWorld, btScalar dt)
|
||||||
{
|
{
|
||||||
btTransform start, end;
|
btTransform start, end;
|
||||||
|
|
||||||
@@ -367,7 +365,7 @@ void KinematicCharacterController::stepDown (const btDynamicsWorld* dynamicsWorl
|
|||||||
|
|
||||||
ClosestNotMeConvexResultCallback callback (m_collisionObject);
|
ClosestNotMeConvexResultCallback callback (m_collisionObject);
|
||||||
|
|
||||||
dynamicsWorld->convexSweepTest (m_shape, start, end, callback);
|
collisionWorld->convexSweepTest (m_shape, start, end, callback);
|
||||||
|
|
||||||
if (callback.HasHit())
|
if (callback.HasHit())
|
||||||
{
|
{
|
||||||
@@ -398,12 +396,12 @@ void KinematicCharacterController::registerPairCacheAndDispatcher (btOverlapping
|
|||||||
m_dispatcher = dispatcher;
|
m_dispatcher = dispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KinematicCharacterController::preStep (const btDynamicsWorld* dynamicsWorld)
|
void KinematicCharacterController::preStep (const btCollisionWorld* collisionWorld)
|
||||||
{
|
{
|
||||||
|
|
||||||
int numPenetrationLoops = 0;
|
int numPenetrationLoops = 0;
|
||||||
m_touchingContact = false;
|
m_touchingContact = false;
|
||||||
while (recoverFromPenetration (dynamicsWorld))
|
while (recoverFromPenetration (collisionWorld))
|
||||||
{
|
{
|
||||||
numPenetrationLoops++;
|
numPenetrationLoops++;
|
||||||
m_touchingContact = true;
|
m_touchingContact = true;
|
||||||
@@ -435,7 +433,7 @@ void KinematicCharacterController::preStep (const btDynamicsWorld* dynamicsWorld
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void KinematicCharacterController::playerStep (const btDynamicsWorld* dynamicsWorld,
|
void KinematicCharacterController::playerStep (const btCollisionWorld* collisionWorld,
|
||||||
btScalar dt,
|
btScalar dt,
|
||||||
int forward,
|
int forward,
|
||||||
int backward,
|
int backward,
|
||||||
@@ -464,9 +462,9 @@ void KinematicCharacterController::playerStep (const btDynamicsWorld* dynamicsWo
|
|||||||
// printf("walkDirection(%f,%f,%f)\n",walkDirection[0],walkDirection[1],walkDirection[2]);
|
// printf("walkDirection(%f,%f,%f)\n",walkDirection[0],walkDirection[1],walkDirection[2]);
|
||||||
// printf("walkSpeed=%f\n",walkSpeed);
|
// printf("walkSpeed=%f\n",walkSpeed);
|
||||||
|
|
||||||
stepUp (dynamicsWorld);
|
stepUp (collisionWorld);
|
||||||
stepForwardAndStrafe (dynamicsWorld, walkDirection * walkSpeed);
|
stepForwardAndStrafe (collisionWorld, walkDirection * walkSpeed);
|
||||||
stepDown (dynamicsWorld, dt);
|
stepDown (collisionWorld, dt);
|
||||||
|
|
||||||
xform.setOrigin (m_currentPosition);
|
xform.setOrigin (m_currentPosition);
|
||||||
m_collisionObject->setWorldTransform (xform);
|
m_collisionObject->setWorldTransform (xform);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
class btCollisionShape;
|
class btCollisionShape;
|
||||||
class btRigidBody;
|
class btRigidBody;
|
||||||
class btDynamicsWorld;
|
class btCollisionWorld;
|
||||||
class btCollisionDispatcher;
|
class btCollisionDispatcher;
|
||||||
|
|
||||||
|
|
||||||
@@ -47,11 +47,11 @@ protected:
|
|||||||
bool m_touchingContact;
|
bool m_touchingContact;
|
||||||
btVector3 m_touchingNormal;
|
btVector3 m_touchingNormal;
|
||||||
|
|
||||||
bool recoverFromPenetration (const btDynamicsWorld* dynamicsWorld);
|
bool recoverFromPenetration (const btCollisionWorld* collisionWorld);
|
||||||
void stepUp (const btDynamicsWorld* dynamicsWorld);
|
void stepUp (const btCollisionWorld* collisionWorld);
|
||||||
void updateTargetPositionBasedOnCollision (const btVector3& hit_normal, btScalar tangentMag = btScalar(0.0), btScalar normalMag = btScalar(1.0));
|
void updateTargetPositionBasedOnCollision (const btVector3& hit_normal, btScalar tangentMag = btScalar(0.0), btScalar normalMag = btScalar(1.0));
|
||||||
void stepForwardAndStrafe (const btDynamicsWorld* dynamicsWorld, const btVector3& walkMove);
|
void stepForwardAndStrafe (const btCollisionWorld* collisionWorld, const btVector3& walkMove);
|
||||||
void stepDown (const btDynamicsWorld* dynamicsWorld, btScalar dt);
|
void stepDown (const btCollisionWorld* collisionWorld, btScalar dt);
|
||||||
public:
|
public:
|
||||||
KinematicCharacterController ();
|
KinematicCharacterController ();
|
||||||
~KinematicCharacterController ();
|
~KinematicCharacterController ();
|
||||||
@@ -64,8 +64,8 @@ public:
|
|||||||
void warp (const btVector3& origin);
|
void warp (const btVector3& origin);
|
||||||
|
|
||||||
virtual void registerPairCacheAndDispatcher (btOverlappingPairCache* pairCache, btCollisionDispatcher* dispatcher);
|
virtual void registerPairCacheAndDispatcher (btOverlappingPairCache* pairCache, btCollisionDispatcher* dispatcher);
|
||||||
void preStep (const btDynamicsWorld* dynamicsWorld);
|
void preStep (const btCollisionWorld* collisionWorld);
|
||||||
void playerStep (const btDynamicsWorld* dynamicsWorld, btScalar dt,
|
void playerStep (const btCollisionWorld* collisionWorld, btScalar dt,
|
||||||
int forward,
|
int forward,
|
||||||
int backward,
|
int backward,
|
||||||
int left,
|
int left,
|
||||||
|
|||||||
Reference in New Issue
Block a user