我正在使用Box2d v2.3 以下box2d方法采用bool“唤醒”:
inline void b2Body::ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point, bool wake)
它做什么?无论我将其设置为YES还是NO,它似乎都不明显 影响我的物理。
早期版本的Box2d不接受布尔 - 他们只是冲动并指出。
编辑:同样,以下方法也是如此:
inline void b2Body::ApplyForce(const b2Vec2& force, const b2Vec2& point, bool wake)
答案 0 :(得分:4)
取自官方Box2D manual:
睡眠是什么意思?嗯,模拟身体是昂贵的,所以我们越少越好地模拟。当身体停下来时,我们想停止模拟它。
当Box2D确定身体(或身体组)已经停止时,身体进入睡眠状态,其CPU开销非常小。如果身体醒着并与睡眠的身体发生碰撞,则睡眠的身体会醒来。如果与其相关的联合或联系被破坏,身体也会醒来。您也可以手动唤醒身体。
所以sleepmode是一种提高性能的方法。当你对它施加一个力时唤醒一个身体是有道理的,所以万一它还没有醒来,它会被唤醒并被模拟,因为那是你可能想要的。
如果它已经醒了,那没关系。它不会设置为与wake=false
一起睡眠并再次唤醒,不会改变任何内容。为安全起见,您应始终使用wake=true
。在最糟糕的情况下,它会稍微损害性能,但只会持续一段时间。然后Box2D会让它重新入睡。
答案 1 :(得分:3)
在v2.3.0之前,ApplyLinearImpulse(...)函数如下所示:
inline void b2Body::ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point)
{
if (m_type != b2_dynamicBody)
{
return;
}
if (IsAwake() == false)
{
SetAwake(true);
}
m_linearVelocity += m_invMass * impulse;
m_angularVelocity += m_invI * b2Cross(point - m_sweep.c, impulse);
}
因此,如果您施加任何力量,它会自动唤醒身体。无论是否睡着了。你必须事先测试它(自己调用IsAwake(...)),这样你可以避免在睡着时使用它。
来自v2.3.0的代码库:
inline void b2Body::ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point, bool wake)
{
if (m_type != b2_dynamicBody)
{
return;
}
if (wake && (m_flags & e_awakeFlag) == 0)
{
SetAwake(true);
}
// Don't accumulate velocity if the body is sleeping
if (m_flags & e_awakeFlag)
{
m_linearVelocity += m_invMass * impulse;
m_angularVelocity += m_invI * b2Cross(point - m_sweep.c, impulse);
}
}
新行是关键:
if (wake && (m_flags & e_awakeFlag) == 0)
如果唤醒==真实并且睡着了,那么唤醒身体。 如果wake == true而不是睡着了,什么也不做。 如果唤醒==假而睡着了,什么也不做。 如果唤醒==假并且没有睡着,则什么也不做。
这适用于:“当wake
为假时,如果身体已经睡着了,请不要对身体施力。”
这有用吗?