Box2d:最大可能的线性速度?

8
我认为我已经配置了Box2d,使每个物体都有某种最大速度限制,但我不确定。我施加一个冲量,例如(100000000, 100000000),但物体的移动速度与(100, 100)一样,而这并不算快。

我正在使用Box2d XNA C#版本。

我的游戏是一个俯视图2D游戏。

以下是一些相关代码:

private readonly Vector2 GRAVITY = new Vector2(0, 0);

    public void initializePhysics(ContactReporter contactReporter)
    {
        world = new World(GRAVITY, true);
        IContactListener contactListener = contactReporter;
        world.ContactListener = contactListener;
    }

    public void Update(GameTime gameTime)
        {
     // ...

            worldState.PhysicsWorld.Step((float)gameTime.ElapsedGameTime.TotalSeconds, 10, 10);

     //...
        }

这里是一个应用冲量的示例代码:

    private void ApplyImpulseFromInput()
    {
        Vector2 movementImpulse = new Vector2();

        if (inputReader.ControlActivation(ActionInputType.MOVE_LEFT) == 1f)
        {
            movementImpulse.X = -Constants.PLAYER_IMPULSE_CONSTANT;
        } else if (inputReader.ControlActivation(ActionInputType.MOVE_RIGHT) == 1f)
        {
            movementImpulse.X = Constants.PLAYER_IMPULSE_CONSTANT; ;
        }

        if (inputReader.ControlActivation(ActionInputType.MOVE_UP) == 1f)
        {
            movementImpulse.Y = -Constants.PLAYER_IMPULSE_CONSTANT; ;
        } else if (inputReader.ControlActivation(ActionInputType.MOVE_DOWN) == 1f)
        {
            movementImpulse.Y = Constants.PLAYER_IMPULSE_CONSTANT; ;
        }

        model.Body.ApplyImpulse(movementImpulse, model.Position);
    }

如果Constants.PLAYER_IMPULSE_CONSTANT的值在1000f1000000000f之间,玩家最多可以移动(-120, -120)(120, 120)。 如果常量更小,比如1f,则玩家移动速度会变慢。

这段代码用于设置游戏世界中的所有物理特性:

        controller.Model.BodyDef = new BodyDef();
        controller.Model.BodyDef.type = controller.Model.Mobile ? BodyType.Dynamic : BodyType.Static;
        controller.Model.Body = worldState.PhysicsWorld.CreateBody(controller.Model.BodyDef);
        controller.Model.Body.SetLinearDamping(10.0f);

可能是线性阻尼吗?我将其从10.0f更改为0,但没有效果。

更新:线性阻尼的奇怪现象:我对使用上述应用冲量方法移动的物体进行了以下观察:

Linear Damping       Max Speed
0f                   120
10f                  120
50f                  120
55f                  90
60f                  0
70f                  0
100f                 0
100000f              0

为什么在线性阻尼的敏感度范围内,介于50f60f之间?

应用脉冲的代码可能会很有用。 - Marcelo Cantos
+1 抵消投票反对者。这是一个合法的问题。 - avpx
2个回答

16

那不是解决问题的方式。在创建box2D世界中的对象时,您应该将其缩小比例。然后,您可以将box2D返回的信息按照自己世界的比例缩放。

例如,假设我的世界中的一个方框长120像素。如果我将该对象缩小30倍,以便能够适当地模拟box2d,则该方框在box2D世界中的长度为4个“像素”(120/30或对象大小/缩放比例)。现在,假设box2D计算出我的方框在box2d世界中移动了3个“像素”。然后,我可以获取该信息并将其放大到我的世界大小,这意味着该方框刚刚移动了90像素(3*30)。希望这不会听起来太混乱。通常我发现自己很难解释清楚。


我曾经遇到过同样的问题,缩小模拟的规模解决了这个问题。 - Nathan S.
5
从Box2D手册上可以得知:"Box2D是针对MKS单位进行调整的。将移动物体的大小大致保持在0.1至10米之间。您需要使用一些缩放系统来呈现您的环境和演员。Box2D测试平台通过使用OpenGL视口变换来实现这一点。" 可以参考引擎示例,如HelloWorld,以便将你自己的单位与其进行比较。 - Engineer

3

我遇到了与2.1a版本相同的问题。我发现修改b2Settings.as文件中第128行可以解决问题。将static public const b2_maxTranslation:Number = 2.0改为更高的数字即可。虽然这可能不是正确的方法,但目前我不知道正确的做法。


9
今天我遇到了这个问题,只不过我使用的是 Box2D 的 C++ 版本。注释中写道:“物体的最大线性速度。此限制非常大,用于防止数值问题。您不需要调整此项。”我的模拟设置为1像素等于1个Box2D单位。我也遇到了速度上限的问题。看起来Box2D希望你将模拟保持在较小的比例尺度上。 - don
是的,你可以这样做,但这不是正确的方法。请参考罗伯特的答案。 - Engineer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接