我有一个在边缘形状上的方盒子。现在我对方盒子施加冲量,让它跳起来。但是当它落在地面上时,就不应该再动了。所以我将方盒子的恢复系数设置为0,并将边缘形状和方盒子的摩擦力系数设置为1。但它仍然会在地面上滑动。如何防止任何滑动?
我有一个在边缘形状上的方盒子。现在我对方盒子施加冲量,让它跳起来。但是当它落在地面上时,就不应该再动了。所以我将方盒子的恢复系数设置为0,并将边缘形状和方盒子的摩擦力系数设置为1。但它仍然会在地面上滑动。如何防止任何滑动?
std::numeric_limits<float>::infinity()
作为第一个摩擦力值尝试,结果是无限摩擦力方块碰到的第一个平台消失了。哎呀!这不是我想要的结果。b2Fixture
的m_friction
成员变量。
- b2Contact
的m_friction
成员变量。
- b2ContactVelocityConstraint
的friction
成员变量。
这些被定义为float32
类型的实例,而float32
本身是float
类型的一种单精度浮点类型。这给我们提供了一个最大的上限,即以下内容可以给我们提供的(不会溢出):
std::numeric_limits<float>::max()
< p > b2Contact
的 m_friction
成员变量实质上是取夹具摩擦力的乘积的平方根的结果:
std::sqrtf(m_fixtureA->m_friction * m_fixtureB->m_friction)
m_friction
值都需要低于浮点数最大值的平方根,以避免在此乘积中潜在的溢出。也就是说,我们可以从以下公式得到任何b2Fixture
摩擦设置的更现实的上限:std::sqrtf(std::numeric_limits<float>::max())
friction
成员变量,这可能就足够好了;但是在b2ContactSolver::SolveVelocityConstraints()
中,它会被另一个浮点数normalImpulse
乘以。因此,float-max的平方根可能仍然过高,无法确保完全避免任何潜在的溢出风险。