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 btRigidBody;
class btDynamicsWorld;
class btCollisionWorld;
class CharacterControllerInterface
{
@@ -20,8 +20,8 @@ public:
virtual void reset () = 0;
virtual void warp (const btVector3& origin) = 0;
virtual void registerPairCacheAndDispatcher (btOverlappingPairCache* pairCache, btCollisionDispatcher* dispatcher)=0;
virtual void preStep (const btDynamicsWorld* dynamicsWorld) = 0;
virtual void playerStep (const btDynamicsWorld* dynamicsWorld, btScalar dt,
virtual void preStep (const btCollisionWorld* collisionWorld) = 0;
virtual void playerStep (const btCollisionWorld* collisionWorld, btScalar dt,
int forward,
int backward,
int left,

View File

@@ -1,6 +1,6 @@
#include "BulletCollision/CollisionShapes/btMultiSphereShape.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "BulletDynamics/Dynamics/btDynamicsWorld.h"
#include "BulletCollision/CollisionDispatch/btCollisionWorld.h"
#include "LinearMath/btDefaultMotionState.h"
#include "DynamicCharacterController.h"
@@ -67,7 +67,7 @@ btCollisionObject* DynamicCharacterController::getCollisionObject ()
return m_rigidBody;
}
void DynamicCharacterController::preStep (const btDynamicsWorld* dynamicsWorld)
void DynamicCharacterController::preStep (const btCollisionWorld* collisionWorld)
{
btTransform xform;
m_rigidBody->getMotionState()->getWorldTransform (xform);
@@ -108,7 +108,7 @@ void DynamicCharacterController::preStep (const btDynamicsWorld* dynamicsWorld)
for (i = 0; i < 2; i++)
{
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())
{
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 backward,
int left,

View File

@@ -7,7 +7,7 @@
class btCollisionShape;
class btRigidBody;
class btDynamicsWorld;
class btCollisionWorld;
///DynamicCharacterController is obsolete/unsupported at the moment
class DynamicCharacterController : public CharacterControllerInterface
@@ -39,8 +39,8 @@ public:
btCollisionObject* getCollisionObject ();
void preStep (const btDynamicsWorld* dynamicsWorld);
void playerStep (const btDynamicsWorld* dynaWorld,btScalar dt,
void preStep (const btCollisionWorld* collisionWorld);
void playerStep (const btCollisionWorld* collisionWorld,btScalar dt,
int forward,
int backward,
int left,

View File

@@ -1,12 +1,10 @@
#include <stdio.h>
#include "GLDebugDrawer.h"
#include "BulletCollision/CollisionShapes/btMultiSphereShape.h"
#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h"
#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "BulletDynamics/Dynamics/btDynamicsWorld.h"
#include "BulletCollision/CollisionDispatch/btCollisionWorld.h"
#include "LinearMath/btDefaultMotionState.h"
#include "KinematicCharacterController.h"
@@ -87,7 +85,7 @@ btVector3 perpindicularComponent (const btVector3& direction, const btVector3& n
KinematicCharacterController::KinematicCharacterController ()
{
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_pairCache = NULL;
m_collisionObject = NULL;
@@ -117,7 +115,7 @@ void KinematicCharacterController::setup (btScalar height, btScalar width, btSca
startTransform.setIdentity ();
startTransform.setOrigin (btVector3(0.0, 4.0, 0.0));
//btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform);
//btRigidBody::btRigidBodyConstructionInfo cInfo(1.0, myMotionState, m_shape);
m_collisionObject = new btCollisionObject ();
m_collisionObject->setWorldTransform(startTransform);
@@ -144,7 +142,7 @@ btCollisionObject* KinematicCharacterController::getCollisionObject ()
return m_collisionObject;
}
bool KinematicCharacterController::recoverFromPenetration (const btDynamicsWorld* dynamicsWorld)
bool KinematicCharacterController::recoverFromPenetration (const btCollisionWorld* collisionWorld)
{
if (m_pairCache == NULL)
@@ -153,7 +151,7 @@ bool KinematicCharacterController::recoverFromPenetration (const btDynamicsWorld
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();
@@ -201,7 +199,7 @@ bool KinematicCharacterController::recoverFromPenetration (const btDynamicsWorld
return penetration;
}
void KinematicCharacterController::stepUp (const btDynamicsWorld* dynamicsWorld)
void KinematicCharacterController::stepUp (const btCollisionWorld* world)
{
// phase 1: up
btTransform start, end;
@@ -216,7 +214,7 @@ void KinematicCharacterController::stepUp (const btDynamicsWorld* dynamicsWorld)
ClosestNotMeConvexResultCallback callback (m_collisionObject);
dynamicsWorld->convexSweepTest (m_shape, start, end, callback);
world->convexSweepTest (m_shape, start, end, callback);
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();
@@ -301,7 +299,7 @@ void KinematicCharacterController::stepForwardAndStrafe (const btDynamicsWorld*
//btScalar margin = m_shape->getMargin();
//m_shape->setMargin(margin - 0.06f);
dynamicsWorld->convexSweepTest (m_shape, start, end, callback);
collisionWorld->convexSweepTest (m_shape, start, end, callback);
//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;
@@ -367,7 +365,7 @@ void KinematicCharacterController::stepDown (const btDynamicsWorld* dynamicsWorl
ClosestNotMeConvexResultCallback callback (m_collisionObject);
dynamicsWorld->convexSweepTest (m_shape, start, end, callback);
collisionWorld->convexSweepTest (m_shape, start, end, callback);
if (callback.HasHit())
{
@@ -398,12 +396,12 @@ void KinematicCharacterController::registerPairCacheAndDispatcher (btOverlapping
m_dispatcher = dispatcher;
}
void KinematicCharacterController::preStep (const btDynamicsWorld* dynamicsWorld)
void KinematicCharacterController::preStep (const btCollisionWorld* collisionWorld)
{
int numPenetrationLoops = 0;
m_touchingContact = false;
while (recoverFromPenetration (dynamicsWorld))
while (recoverFromPenetration (collisionWorld))
{
numPenetrationLoops++;
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,
int forward,
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("walkSpeed=%f\n",walkSpeed);
stepUp (dynamicsWorld);
stepForwardAndStrafe (dynamicsWorld, walkDirection * walkSpeed);
stepDown (dynamicsWorld, dt);
stepUp (collisionWorld);
stepForwardAndStrafe (collisionWorld, walkDirection * walkSpeed);
stepDown (collisionWorld, dt);
xform.setOrigin (m_currentPosition);
m_collisionObject->setWorldTransform (xform);

View File

@@ -7,7 +7,7 @@
class btCollisionShape;
class btRigidBody;
class btDynamicsWorld;
class btCollisionWorld;
class btCollisionDispatcher;
@@ -47,11 +47,11 @@ protected:
bool m_touchingContact;
btVector3 m_touchingNormal;
bool recoverFromPenetration (const btDynamicsWorld* dynamicsWorld);
void stepUp (const btDynamicsWorld* dynamicsWorld);
bool recoverFromPenetration (const btCollisionWorld* collisionWorld);
void stepUp (const btCollisionWorld* collisionWorld);
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 stepDown (const btDynamicsWorld* dynamicsWorld, btScalar dt);
void stepForwardAndStrafe (const btCollisionWorld* collisionWorld, const btVector3& walkMove);
void stepDown (const btCollisionWorld* collisionWorld, btScalar dt);
public:
KinematicCharacterController ();
~KinematicCharacterController ();
@@ -64,8 +64,8 @@ public:
void warp (const btVector3& origin);
virtual void registerPairCacheAndDispatcher (btOverlappingPairCache* pairCache, btCollisionDispatcher* dispatcher);
void preStep (const btDynamicsWorld* dynamicsWorld);
void playerStep (const btDynamicsWorld* dynamicsWorld, btScalar dt,
void preStep (const btCollisionWorld* collisionWorld);
void playerStep (const btCollisionWorld* collisionWorld, btScalar dt,
int forward,
int backward,
int left,