我想限制一个身体可以旅行的最大速度。
问题是,即使我做了类似这个答案建议的事情:
/* 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 );
例如,如果在限制速度之前我正在对身体施加一些巨大的力怎么办?即使线速度暂时被限制为 maxSpeed,在下一个时间步中,Box2D 也会考虑 b2Body::m_force 值,并有效地以比 maxSpeed 更快的速度移动我的身体。
所以我想出了这个(不得不将 b2Body::m_force 公开):
if ( speed > maxSpeed ) {
body->SetLinearVelocity( maxSpeed * vel );
body->m_force = b2Vec2(0, 0)
}
然而,这仍然不能正确处理问题。
如果速度比 maxSpeed略小一点,那么条件不会被击中,但 m_force 值仍然足够大,足以使速度增加太多怎么办?
关键是当我使用增量累加器步进时,我无法准确预测力将如何影响速度,而且我不知道目前需要多少物理步骤。
除了在 Box2D 源代码中集成位置之前直接限制速度之外,还有什么方法可以解决这个问题?