术语" STEP"在子弹物理学中意味着什么?
函数stepSimulation()
及其参数是什么意思?
我已阅读documentation但我无法掌握任何内容。
任何有效的解释都会有很大帮助。
答案 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
。