我在边缘形状上有一个盒子形状。现在我在盒子上施加冲动,让它可以跳跃。但是当它降落在地面上时,它不应该再移动了。所以我设置了盒子的restitution 0。边形和盒形的摩擦力为1。但在地面上很容易滑动。如何防止滑动?
最佳答案
正如您所发现的,您可以通过增加足够高的摩擦力来防止滑动。
至于您可以将摩擦设置为的最大值是多少,没有记录摩擦值的最大值。也就是说,最大摩擦值有一些限制。
尝试std::numeric_limits<float>::infinity()
作为 VaryingFriction
中的第一个摩擦值试验台测试,结果无限摩擦立方体撞击的第一个平台消失。哎呀!不是我想要的结果。
对 Box2D 2.3.2 C++ source code 的评论揭示摩擦相关变量,如:
m_friction
b2Fixture
的成员变量. m_friction
b2Contact
的成员变量. friction
b2ContactVelocityConstraint
的成员变量. 这些被定义为类型
float32
的实例。又是 float
类型- a single precision floating-point type .这为我们提供了以下可以给我们(没有溢出)的最大上限:std::numeric_limits<float>::max()
m_friction
b2Contact
的成员变量然而,本质上是取夹具摩擦乘积的平方根的结果:std::sqrtf(m_fixtureA->m_friction * m_fixtureB->m_friction)
所以任何给定的灯具
m_friction
value 需要低于 float-max 的平方根,以避免此产品中的潜在溢出。即,对于任何 b2Fixture
,我们得到了一个更现实的上限。的摩擦设置可以来自:std::sqrtf(std::numeric_limits<float>::max())
如果不是因为
friction
发生的事情,那可能已经足够好了。 b2ContactVelocityConstraint
的成员变量;它乘以另一个浮点数(在 b2ContactSolver::SolveVelocityConstraints()
中) - normalImpulse
每个速度约束点。所以 float-max 的平方根可能仍然太高,无法确保避免任何溢出的可能性。溢出可能意味着使用无穷大摩擦会发生什么:哎呀!虽然由于使用太高的摩擦值而消失的主体很可能是一个错误,但没有修复库的源代码,我认为我们有点卡住了,然后将最大浮点值的平方根作为仍然存在的上限有风险。顺便说一句,我提交了 issue关于这个以及我找到的解决方法。
根据经验,我会增加固定装置的摩擦力,直到不再滑动,然后就让它保持不变。
OTOH,还有其他防止滑动的方法(除了增加摩擦力),比如这些......
关于Box2d 将地面摩擦力设置为最大 - 无滑动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24687144/