What does the term "STEP" means in bullet physics?
What does the function stepSimulation()
and its parameters mean?
I have read the documentation but i could not get hold of anything.
Any valid explanation would be of great help.
btDynamicsWorld::stepSimulation(
btScalar timeStep,
int maxSubSteps=1,
btScalar fixedTimeStep=btScalar(1.)/btScalar(60.));
timeStep
- time passed after last simulation.
Internally simulation is done for some internal constant steps. fixedTimeStep
fixedTimeStep
~~~ 0.01666666 = 1/60
if timeStep
is 0.1 then it will include 6 (timeStep / fixedTimeStep
) internal simulations.
To make glider movements BulletPhysics interpolate final step results according reminder after division (timeStep / fixedTimeStep
)
I know I'm late, but I thought the accepted answer was only marginally better than the documentation's description.
timeStep
: The amount of seconds, not milliseconds, passed since the last call to stepSimulation
.
maxSubSteps
: Should generally stay at one so Bullet interpolates current values on its own. A value of zero implies a variable tick rate, meaning Bullet advances the simulation exactly timeStep
seconds instead of interpolating. This feature is buggy and not recommended. A value greater than one must always satisfy the equation timeStep < maxSubSteps * fixedTimeStep
or you're losing time in the simulation.
fixedTimeStep
: Inversely proportional to the simulation's resolution. Resolution increases as this value decreases. Keep in mind that a higher resolution means it takes more CPU.
timeStep
- the amount of time in seconds to step the simulation by. Typically you're going to be passing it the time since you last called it.
maxSubSteps
- the maximum number of steps that Bullet is allowed to take each time you call it.
fixedTimeStep
- regulates resolution of the simulation. If your balls penetrates your walls instead of colliding with them try to decrease it.
Here i would like to address the issue in Proxy's answer about special meaning of value 1
for maxSubSteps
. There is only one special value, that is 0
and you most likely don't want to use it because then simulation will go with non-constant time step. All other values are the same. Let's have a look at the actual code:
if (maxSubSteps)
{
m_localTime += timeStep;
...
if (m_localTime >= fixedTimeStep)
{
numSimulationSubSteps = int(m_localTime / fixedTimeStep);
m_localTime -= numSimulationSubSteps * fixedTimeStep;
}
}
...
if (numSimulationSubSteps)
{
//clamp the number of substeps, to prevent simulation grinding spiralling down to a halt
int clampedSimulationSteps = (numSimulationSubSteps > maxSubSteps) ? maxSubSteps : numSimulationSubSteps;
...
for (int i = 0; i < clampedSimulationSteps; i++)
{
internalSingleStepSimulation(fixedTimeStep);
synchronizeMotionStates();
}
}
So, there is nothing special about maxSubSteps
equal to 1
. You should really abide this formula timeStep < maxSubSteps * fixedTimeStep
if you don't want to lose time.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With