我的边缘形状有一个盒子形状。现在我在盒子上施加冲动,这样就可以跳跃了。但是当它降落在地面上时,它不应该再移动了。所以我已经设置了恢复原状0。边缘形状和盒子形状的摩擦力为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,还有其他方法可以防止滑动(除了增加摩擦力),就像这些......