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:
erwin.coumans
2008-07-09 18:41:41 +00:00
parent 2c224b41c5
commit b9bc96e22b
5 changed files with 34 additions and 36 deletions

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -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);

View File

@@ -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,