Box2d将地面摩擦设置为最大 - 没有滑动

时间:2014-07-10 22:11:22

标签: box2d

我的边缘形状有一个盒子形状。现在我在盒子上施加冲动,这样就可以跳跃了。但是当它降落在地面上时,它不应该再移动了。所以我已经设置了恢复原状0。边缘形状和盒子形状的摩擦力为1.但它很容易在地面上滑动。如何防止任何滑动?

1 个答案:

答案 0 :(得分:0)

正如您所发现的那样,您可以通过增加摩擦力来防止滑动。

关于您可以设定摩擦力的最大值是什么,摩擦值没有记录的最大值。也就是说,最大摩擦值可能存在一些限制。

尝试std::numeric_limits<float>::infinity()作为VaryingFriction Testbed测试中的第一个摩擦值,导致无限摩擦立方体撞击的第一个平台消失。 哎呀!不是我想要的结果。

Box2D 2.3.2 C++ source code的回顾揭示了摩擦相关变量,如:

  • m_friction的{​​{1}}成员变量。
  • b2Fixture的{​​{1}}成员变量。
  • m_friction的{​​{1}}成员变量。

这些被定义为b2Contact类型的实例,而friction类型的类型为b2ContactVelocityConstraint - a single precision floating-point type。这给了我们以下可以给我们(没有溢出)的最大上限:

float32

float的{​​{1}}成员变量实际上是取得固定装置产品的平方根的结果。摩擦:

std::numeric_limits<float>::max()

因此,任何给定的fixture m_friction值都必须低于float-max的平方根,以避免此产品中存在潜在溢出。也就是说,我们得到了一个更真实的上限,可用于b2Contact的摩擦设置:

std::sqrtf(m_fixtureA->m_friction * m_fixtureB->m_friction)

如果m_friction b2Fixture成员变量std::sqrtf(std::numeric_limits<float>::max()) 之后发生的事情没有发生,那就足够了。它被另一个浮点数乘以(friction) - 每个速度约束点的b2ContactVelocityConstraint。所以float-max的平方根可能仍然太高,以至于不能避免任何溢出的可能性。

溢出可能意味着使用无穷大发生摩擦会发生什么:哎呀!虽然由于使用过高的摩擦值而导致身体消失可能是一个错误,但是如果没有修复库的源代码,我认为我们会因为max float值的平方根而陷入困境。作为上限,仍然存在风险。顺便说一句,我提交了issue关于此问题以及我发现修复它的方法。

根据经验,我会增加夹具的摩擦力,直到没有更多的滑动,然后将其留在那里。

OTOH,还有其他方法可以防止滑动(除了增加摩擦力),就像这些......

  1. 更改正文的类型。如果在与地面碰撞后将车身设置为静止,则它根本不会物理移动。直到你把它改回动态。
  2. 当盒子与地面碰撞时,创建一个关节,将盒子绑在地上。