gpt4 book ai didi

c++ - 实际上限制了 Box2D 中的最大速度

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:56 25 4
gpt4 key购买 nike

我想限制 body 可以移动的最大速度。

问题是,即使我做了类似 this answer 的事情建议:

/* after applying forces from input for example */
b2Vec2 vel = body->GetLinearVelocity();
float speed = vel.Normalize();//normalizes vector and returns length
if ( speed > maxSpeed )
body->SetLinearVelocity( maxSpeed * vel );

例如,如果在限制速度之前我对 body 施加了一些巨大的力会怎么样?即使线速度暂时被限制为 maxSpeed,在下一个时间步长 Box2D 也会考虑 b2Body::m_force 值并有效地使我的 body 移动得比 maxSpeed 更快。

所以我想到了这个(必须将 b2Body::m_force 移至公共(public)):

if ( speed > maxSpeed ) {
body->SetLinearVelocity( maxSpeed * vel );
body->m_force = b2Vec2(0, 0)
}

但这仍然不能很好地解决问题。

如果速度略微小于 maxSpeed 这样就不会达到条件,但 m_force 值仍然足够大以增加速度太多怎么办?

关键是我无法准确预测力将如何影响速度,因为我正在使用 delta 累加器进行步进,而且我不知道目前需要多少物理步。

除了在 Box2D 源代码中集成位置之前直接限制速度之外,还有什么方法可以解决这个问题吗?

最佳答案

我第一次尝试解决这个问题是简单地执行上面的代码片段,不是每个循环,而是每个物理子步骤,这意味着如果我的 delta accumulator告诉我必须执行 n b2World::Step的,我也将速度限制在 n 次:

// source code taken form above link and modified for my purposes
for (int i = 0; i < nStepsClamped; ++ i)
{
resetSmoothStates_ ();

// here I execute whole systems that apply accelerations, drag forces and limit maximum velocities
// ...
if ( speed > maxSpeed )
body->SetLinearVelocity( maxSpeed * vel );
// ...

singleStep_ (FIXED_TIMESTEP);

// NOTE I'M CLEARING FORCES EVERY SUBSTEP to avoid excessive accumulation
world_->ClearForces ();
}

虽然这让我保持恒定的速度不管帧速率如何(这是我最关心的问题,因为我的 Action 很不稳定),但它并不总是 <= maxSpeed .同样的场景:想象一下在限制速度并执行 b2World::Step 之前施加了一个巨大的力.

现在,我可以根据当前速度简单地计算要施加的实际力,因为我知道在下一次验证之前只会施加一次力,但是我已经提到了另一个简单的解决方案并最终坚持使用:

  1. 转到 Box2D\Dynamics\b2Body.h
  2. 添加float32 m_max_speed公共(public)成员并用 -1.f 初始化它所以最初我们不限制任何物体的速度。
  3. 转到 Box2D\Dynamics\b2Island.cpp。
  4. 找到第 222 行。
  5. 添加以下if条件:

    m_positions[i].c = c;
    m_positions[i].a = a;

    if (b->m_max_speed >= 0.f) {
    float32 speed = v.Normalize();
    if (speed > b->m_max_speed)
    v *= b->m_max_speed;
    else v *= speed;
    }

    m_velocities[i].v = v;
    m_velocities[i].w = w;

即使没有我上面描述的子步也可以工作但请记住,如果您要模拟空气阻力,在每个子步中施加阻力可以保证即使帧速率不同也能进行模拟。

关于c++ - 实际上限制了 Box2D 中的最大速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19726732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com