5

子弹物理学中的“STEP”一词是什么意思?

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

我已阅读文档,但我无法掌握任何内容。

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

4

3 回答 3

12

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

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

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

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

于 2014-01-22T03:13:20.110 回答
5
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)

于 2012-10-08T11:13:57.093 回答
2
  • timeStep- 逐步模拟的时间量(以秒为单位)。通常,您将通过自上次调用它以来的时间。

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

  • fixedTimeStep- 调节模拟的分辨率。如果你的球穿透你的墙壁而不是与它们碰撞,请尝试减少它。


在这里,我想解决 Proxy 的答案中关于 value1的特殊含义的问题maxSubSteps。只有一个特殊值,即0您很可能不想使用它,因为模拟将使用非常量的时间步长。所有其他值都相同。让我们看一下实际的代码

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所以,等于没有什么特别之处1timeStep < maxSubSteps * fixedTimeStep如果您不想浪费时间,您应该真正遵守这个公式。

于 2018-11-02T09:06:04.207 回答