我希望限制物体的最大行进速度。
问题是,即使我按照此答案所建议的做法:
/* after applying forces from input for example */
b2Vec2 vel = body->GetLinearVelocity();
float speed = vel.Normalize();//normalizes vector and returns length
if ( speed > maxSpeed )
body->SetLinearVelocity( maxSpeed * vel );
假设在限制速度之前,我对物体施加了巨大的力量,怎么办呢?即使线性速度此刻被限制为最大速度,下一个时间步骤中,Box2D将考虑b2Body::m_force值,并有效地使我的物体移动得比最大速度更快。
因此,我想到了这个解决方案(不得不将b2Body::m_force移到公共位置):
if ( speed > maxSpeed ) {
body->SetLinearVelocity( maxSpeed * vel );
body->m_force = b2Vec2(0, 0)
}
然而,这仍然不能很好地解决问题。
如果速度略小于最大速度,则条件不会被触发,但m_force值仍将足够大,以致于增加速度过多?
关键是我无法准确预测力量如何影响速度,因为我使用delta累加器进行步进,并且我不知道需要多少物理步骤才能到达目标。
除了在Box2D源代码中直接限制积分位置之前的速度之外,还有其他处理方式吗?