Box2d 将地面摩擦力设置为最大 - 无滑动

标签 box2d

我在边缘形状上有一个盒子形状。现在我在盒子上施加冲动,让它可以跳跃。但是当它降落在地面上时,它不应该再移动了。所以我设置了盒子的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,还有其他防止滑动的方法(除了增加摩擦力),比如这些......
  • 改变 body 的类型。如果在与地面碰撞后将 body 设置为静态,则它根本不会物理移动。直到你把它改回动态。
  • 当盒子与地面碰撞时创建一个关节以将盒子绑定(bind)到地面。
  • 关于Box2d 将地面摩擦力设置为最大 - 无滑动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24687144/

    相关文章:

    iphone - box2d 凹体

    Box2D 得到我 body 的形状

    Box2d:为什么不是凹形?

    javascript - Box2d 从旋转的物体中获取形状点

    iphone - 如何在 xcode 中配置 Box2D

    box2d - Libgdx Box2D 将图像设置为 body

    cocos2d-iphone - 像 CCSprite 对象一样移动 Box2d 实体

    python - 当圆正好位于两个正方形之间时,它会改变方向

    c++ - CMake 错误 : CMake was unable to find a build program corresponding to "MinGW Makefiles"

    iphone - cocos2d中如何设置动画的帧