“唤醒”对b2Body :: ApplyLinearImpulse有什么影响?

时间:2014-01-01 09:59:11

标签: box2d

我正在使用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)

2 个答案:

答案 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为假时,如果身体已经睡着了,请不要对身体施力。”

这有用吗?