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:
@@ -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;
|
||||||
|
|||||||
@@ -150,6 +150,9 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual void clearForces();
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //BT_DISCRETE_DYNAMICS_WORLD_H
|
#endif //BT_DISCRETE_DYNAMICS_WORLD_H
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user