首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Box2d将地面摩擦力设为最大-不滑动

Box2d将地面摩擦力设为最大-不滑动
EN

Stack Overflow用户
提问于 2014-07-10 22:11:21
回答 1查看 1.6K关注 0票数 4

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

EN

回答 1

Stack Overflow用户

发布于 2017-02-02 00:41:03

正如你所发现的,你可以通过增加摩擦力来防止滑动--足够高。

至于你可以设置摩擦力的最大值是什么,没有记录的最大摩擦力值。尽管如此,最大摩擦力值还是有一些限制的。

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

Box2D 2.3.2 C++源代码的回顾揭示了摩擦相关变量,如:

  • m_friction成员变量b2Fixture
  • m_friction成员变量b2Contact
  • friction成员变量b2ContactVelocityConstraint

它们被定义为float32类型的实例,而后者又是float - 一种单精度浮点型类型的实例。这给了我们以下内容的最大上限(无溢出):

代码语言:javascript
复制
std::numeric_limits<float>::max()

然而,m_friction成员变量b2Contact本质上是获取夹具摩擦积的平方根的结果:

代码语言:javascript
复制
std::sqrtf(m_fixtureA->m_friction * m_fixtureB->m_friction)

因此,任何给定夹具的m_friction值都需要在浮点-最大值的平方根以下,以避免本产品可能出现溢出。也就是说,对于任何b2Fixture的摩擦力设置,我们得到了一个更真实的上限:

代码语言:javascript
复制
std::sqrtf(std::numeric_limits<float>::max())

如果不是因为friction成员变量b2ContactVelocityConstraint的情况,那么这可能就足够了;它被乘以(在b2ContactSolver::SolveVelocityConstraints()中)另一个浮点--每个速度约束点的normalImpulse。因此,浮动-最大值的平方根可能仍然太高,无法确保避免任何溢出的可能性。

溢出可能意味着使用无穷大来摩擦:哎呀!虽然由于使用过高的摩擦力值而消失的物体很可能是一个缺陷,没有修复库的源代码,但我认为我们还是把最大浮点值的平方根作为一个上限,这仍然是有风险的。顺便提一句,我提交了一份关于这个问题的问题文件,并找到了修复它的方法。

根据经验,我会增加夹具的摩擦力,直到不再滑动为止,然后把它留在那里。

OTOH,还有其他防止滑动的方法(除了增加摩擦力),比如.

  1. 改变身体的类型。如果你把身体在与地面碰撞后保持静止,它就不会在身体上移动。除非你把它变回动态。
  2. 当盒子与地面相撞时创建一个接头,将盒子绑在地面上。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24687144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档