Moved the 'btRigidBody::clearForce' to the end of the stepSimulation, instead of in each substep.

Should help with this issue, reported here: http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1601
We can optionally leave out the 'clearForces'.
Thanks everyone for the discussion.
This commit is contained in:
ejcoumans
2007-12-12 02:53:51 +00:00
parent 210a913110
commit 947dc8d33d
6 changed files with 198 additions and 157 deletions

View File

@@ -196,6 +196,21 @@ void btDiscreteDynamicsWorld::debugDrawWorld()
} }
} }
void btDiscreteDynamicsWorld::clearForces()
{
//todo: iterate over awake simulation islands!
for ( int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
if (body)
{
body->clearForces();
}
}
}
void btDiscreteDynamicsWorld::synchronizeMotionStates() void btDiscreteDynamicsWorld::synchronizeMotionStates()
{ {
{ {
@@ -292,6 +307,8 @@ int btDiscreteDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps,
synchronizeMotionStates(); synchronizeMotionStates();
clearForces();
CProfileManager::Increment_Frame_Counter(); CProfileManager::Increment_Frame_Counter();
return numSimulationSubSteps; return numSimulationSubSteps;

View File

@@ -150,6 +150,9 @@ public:
} }
virtual void clearForces();
}; };
#endif //BT_DISCRETE_DYNAMICS_WORLD_H #endif //BT_DISCRETE_DYNAMICS_WORLD_H

View File

@@ -78,6 +78,9 @@ class btDynamicsWorld : public btCollisionWorld
virtual btDynamicsWorldType getWorldType() const=0; virtual btDynamicsWorldType getWorldType() const=0;
virtual void clearForces() = 0;
}; };
#endif //BT_DYNAMICS_WORLD_H #endif //BT_DYNAMICS_WORLD_H

View File

@@ -290,7 +290,6 @@ void btRigidBody::integrateVelocities(btScalar step)
m_angularVelocity *= (MAX_ANGVEL/step) /angvel; m_angularVelocity *= (MAX_ANGVEL/step) /angvel;
} }
clearForces();
} }
btQuaternion btRigidBody::getOrientation() const btQuaternion btRigidBody::getOrientation() const

View File

@@ -85,10 +85,27 @@ int btSimpleDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps, b
synchronizeMotionStates(); synchronizeMotionStates();
clearForces();
return 1; return 1;
} }
void btSimpleDynamicsWorld::clearForces()
{
//todo: iterate over awake simulation islands!
for ( int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
if (body)
{
body->clearForces();
}
}
}
void btSimpleDynamicsWorld::setGravity(const btVector3& gravity) void btSimpleDynamicsWorld::setGravity(const btVector3& gravity)
{ {

View File

@@ -69,6 +69,8 @@ public:
return BT_SIMPLE_DYNAMICS_WORLD; return BT_SIMPLE_DYNAMICS_WORLD;
} }
virtual void clearForces();
}; };
#endif //BT_SIMPLE_DYNAMICS_WORLD_H #endif //BT_SIMPLE_DYNAMICS_WORLD_H