improvements/bugfixes related to kinematic(animated) objects, synchronizeMotionStates

This commit is contained in:
ejcoumans
2006-10-19 15:20:38 +00:00
parent d11572a4d7
commit 289c5ca7fe
9 changed files with 71 additions and 40 deletions

View File

@@ -92,6 +92,11 @@ struct btCollisionObject
return m_collisionFlags & CF_KINEMATIC_OJBECT;
}
inline bool isStaticOrKinematicObject() const
{
return m_collisionFlags & (CF_KINEMATIC_OJBECT | CF_STATIC_OBJECT);
}
inline bool hasContactResponse() const {
return !(m_collisionFlags & CF_NO_CONTACT_RESPONSE);
}

View File

@@ -237,6 +237,16 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,
if (((colObj0) && colObj0->GetActivationState() != ISLAND_SLEEPING) ||
((colObj1) && colObj1->GetActivationState() != ISLAND_SLEEPING))
{
//kinematic objects don't merge islands, but wake up all connected objects
if (colObj0->isKinematicObject() && colObj0->GetActivationState() != ISLAND_SLEEPING)
{
colObj1->SetActivationState(ACTIVE_TAG);
}
if (colObj1->isKinematicObject() && colObj1->GetActivationState() != ISLAND_SLEEPING)
{
colObj0->SetActivationState(ACTIVE_TAG);
}
//filtering for response
if (dispatcher->needsResponse(colObj0,colObj1))
islandmanifold.push_back(manifold);

View File

@@ -145,7 +145,7 @@ void btDiscreteDynamicsWorld::synchronizeMotionStates()
debugDrawObject(colObj->m_worldTransform,colObj->m_collisionShape,color);
}
btRigidBody* body = btRigidBody::upcast(colObj);
if (body && body->getMotionState())
if (body && body->getMotionState() && !body->isStaticOrKinematicObject())
{
if (body->GetActivationState() != ISLAND_SLEEPING)
{
@@ -524,7 +524,7 @@ void btDiscreteDynamicsWorld::integrateTransforms(float timeStep)
btRigidBody* body = btRigidBody::upcast(colObj);
if (body)
{
if (body->IsActive() && (!body->isStaticObject()))
if (body->IsActive() && (!body->isStaticOrKinematicObject()))
{
body->predictIntegratedTransform(timeStep, predictedTrans);
body->proceedToTransform( predictedTrans);
@@ -545,7 +545,7 @@ void btDiscreteDynamicsWorld::predictUnconstraintMotion(float timeStep)
btRigidBody* body = btRigidBody::upcast(colObj);
if (body)
{
if (!body->isStaticObject())
if (!body->isStaticOrKinematicObject())
{
if (body->IsActive())
{

View File

@@ -37,7 +37,6 @@ btRigidBody::btRigidBody(float mass, btMotionState* motionState, btCollisionShap
m_angularVelocity(0.f,0.f,0.f),
m_linearDamping(0.f),
m_angularDamping(0.5f),
m_kinematicTimeStep(0.f),
m_optionalMotionState(motionState),
m_contactSolverType(0),
m_frictionSolverType(0)
@@ -73,7 +72,6 @@ btRigidBody::btRigidBody( float mass,const btTransform& worldTransform,btCollisi
m_angularVelocity(0.f,0.f,0.f),
m_linearDamping(0.f),
m_angularDamping(0.5f),
m_kinematicTimeStep(0.f),
m_optionalMotionState(0),
m_contactSolverType(0),
m_frictionSolverType(0)
@@ -109,15 +107,17 @@ void btRigidBody::predictIntegratedTransform(btScalar timeStep,btTransform& pred
void btRigidBody::saveKinematicState(btScalar timeStep)
{
if (m_kinematicTimeStep)
//todo: clamp to some (user definable) safe minimum timestep, to limit maximum angular/linear velocities
if (timeStep != 0.f)
{
//if we use motionstate to synchronize world transforms, get the new kinematic/animated world transform
if (getMotionState())
getMotionState()->getWorldTransform(m_worldTransform);
btVector3 linVel,angVel;
btTransformUtil::calculateVelocity(m_interpolationWorldTransform,m_worldTransform,m_kinematicTimeStep,m_linearVelocity,m_angularVelocity);
btTransformUtil::calculateVelocity(m_interpolationWorldTransform,m_worldTransform,timeStep,m_linearVelocity,m_angularVelocity);
m_interpolationWorldTransform = m_worldTransform;
//printf("angular = %f %f %f\n",m_angularVelocity.getX(),m_angularVelocity.getY(),m_angularVelocity.getZ());
}
m_kinematicTimeStep = timeStep;
}
void btRigidBody::getAabb(btVector3& aabbMin,btVector3& aabbMax) const
@@ -154,7 +154,7 @@ void btRigidBody::setDamping(btScalar lin_damping, btScalar ang_damping)
void btRigidBody::applyForces(btScalar step)
{
if (isStaticObject() || isKinematicObject())
if (isStaticOrKinematicObject())
return;
applyCentralForce(m_gravity);
@@ -229,7 +229,7 @@ void btRigidBody::updateInertiaTensor()
void btRigidBody::integrateVelocities(btScalar step)
{
if (isStaticObject() || isKinematicObject())
if (isStaticOrKinematicObject())
return;
m_linearVelocity += m_totalForce * (m_inverseMass * step);

View File

@@ -56,7 +56,6 @@ class btRigidBody : public btCollisionObject
btScalar m_linearDamping;
btScalar m_angularDamping;
btScalar m_kinematicTimeStep;
//m_optionalMotionState allows to automatic synchronize the world transform for active objects
btMotionState* m_optionalMotionState;
@@ -148,7 +147,6 @@ public:
void applyTorqueImpulse(const btVector3& torque)
{
if (!isStaticObject()&& !isKinematicObject())
m_angularVelocity += m_invInertiaTensorWorld * torque;
}