【问题标题】:Box2D Gravity to specific object?Box2D对特定物体的重力?
【发布时间】:2011-10-24 03:23:17
【问题描述】:

我看到每个人都说你在 Box2D 世界中像这样添加重力:

b2Vec2 gravity = b2Vec2(0.0f, -10.0f);
bool doSleep = false;
world = new b2World(gravity, doSleep);

问题是,如果我只希望重力作用于包含来自 CCSprite 的 userData 的特定 b2Body 怎么办? AFAIK 这会将重力应用于世界上我不想要的一切,所以有人可以向我解释如何将这种重力仅应用于特定的 b2Body 吗?

谢谢!

编辑1: 我可以只做这行吗,

_bottomBody->ApplyForce(gravity, _bottomBody->GetPosition());

Instead of the world = new b2World... 等等...这不是只在那个 b2Body 上对重力起作用吗?

【问题讨论】:

    标签: ios box2d gravity physics-engine


    【解决方案1】:

    只需在每一帧对特定的 b2Body 施加一个力/脉冲。它会模拟重力。

    // a procedure called every frame
    void Application::on_update_world(double t)
    {
      m_body_with_custom_gravity->applyForce(CUSTOM_GRAVITY * m_body_with_custom_gravity->getMass());
    
      m_phys_world->Step(t, VEL_ITERATIONS, POS_ITERATIONS);
    }
    

    与您的问题密切相关的主题: How to apply constant force on a Box2D body?

    【讨论】:

    • 怎么样?我只是宁愿使用上面的方式,有没有什么办法可以修改我上面的代码只适用于一个对象?
    • 您的应用程序无疑有一个框架循环,即您调用 b2World::step() 的过程/方法。在此过程中,您需要为指定的主体调用 applyForce 方法。请参阅此答案中的代码示例。
    • 我的应用程序没有帧循环。我的应用程序是 Box2d 与 Cocos2d 与 Obj C 的混合。我只是使用一个 Cocos2D 游戏循环,它每隔可能的一秒就会被调用,这意味着视图何时更新。如果该代码对我有用,请检查我原始帖子中的 Edit 1。
    • 您的引擎在哪里调用 b2World::Step()?这只是对你的身体施加力量的正确位置。我提醒一下,为了正确模拟,必须在每次调用 b2World::Step() 方法之前将自定义重力应用于身体。
    • box2d 引擎在 b2World::Step() 结束时重置所有施加到物体上的力,因此在每次调用 b2World::Step() 方法之前,必须将自定义重力重新应用到物体上.
    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多