子弹物理学中的“STEP”一词是什么意思?
函数stepSimulation()
及其参数是什么意思?
我已阅读文档,但我无法掌握任何内容。
任何有效的解释都会有很大帮助。
我知道我迟到了,但我认为接受的答案只比文档的描述好一点。
timeStep
: 自上次调用以来经过的秒数,而不是毫秒数stepSimulation
。
maxSubSteps
:通常应保持为 1,以便 Bullet 自行插入当前值。零值意味着可变的滴答率,这意味着 Bullet 将模拟精确地推进timeStep
几秒而不是插值。这个功能有问题,不推荐。大于 1 的值必须始终满足等式timeStep < maxSubSteps * fixedTimeStep
,否则您将在模拟中浪费时间。
fixedTimeStep
:与模拟的分辨率成反比。分辨率随着该值的减小而增加。请记住,更高的分辨率意味着它需要更多的 CPU。
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
)
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
所以,等于没有什么特别之处1
。timeStep < maxSubSteps * fixedTimeStep
如果您不想浪费时间,您应该真正遵守这个公式。