什么“步骤”在stepSimulation中意味着什么,它的参数在Bullet Physics中意味着什么?

时间:2012-10-08 08:49:47

标签: bulletphysics

术语" STEP"在子弹物理学中意味着什么?

函数stepSimulation()及其参数是什么意思?

我已阅读documentation但我无法掌握任何内容。

任何有效的解释都会有很大帮助。

3 个答案:

答案 0 :(得分:6)

我知道我迟到了,但我认为接受的答案只比文档描述略好一些。

timeStep:自上次调用stepSimulation以来经过的秒数,而不是毫秒数。

maxSubSteps:通常应保持为1,因此Bullet会自行插入当前值。值为零意味着可变的滴答率,这意味着Bullet将模拟精确地提前timeStep秒而不是插值。此功能有问题,不推荐使用。大于1的值必须始终满足等式timeStep < maxSubSteps * fixedTimeStep,否则您将在模拟中浪费时间。

fixedTimeStep:与模拟的分辨率成反比。分辨率随着该值的减小而增加。请记住,更高的分辨率意味着它需要更多的CPU。

答案 1 :(得分:4)

btDynamicsWorld::stepSimulation(
   btScalar timeStep,
   int maxSubSteps=1,
   btScalar fixedTimeStep=btScalar(1.)/btScalar(60.));

timeStep - 上次模拟后经过的时间。

对一些内部常量步骤进行内部模拟。 fixedTimeStep

fixedTimeStep ~~~ 0.01666666 = 1/60

如果timeStep为0.1则会包含6个(timeStep / fixedTimeStep)内部模拟。

制作滑翔机动作BulletPhysics在分割后根据提醒插入最终步骤结果(timeStep / fixedTimeStep

答案 2 :(得分:0)

  • timeStep-模拟所用的时间(秒)。通常,您会自上次调用它起就经过它。

  • maxSubSteps-每次调用Bullet时允许执行的最大步骤数。

  • fixedTimeStep-调节模拟的分辨率。如果您的球穿透了墙壁而不是撞到墙壁,请尝试减小它。


在这里,我想解决Proxy的答案中关于1的值maxSubSteps的特殊含义的问题。只有一个特殊值,即0,您很可能不想使用它,因为那样一来,模拟将以非恒定的时间步长进行。所有其他值都相同。让我们看一下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();
    }
}

因此,maxSubSteps等于1没什么特别的。如果您不想失去时间,您应该真正遵守这个公式timeStep < maxSubSteps * fixedTimeStep