Box2d:最大可能的线速度?

Nic*_*ner 8 c# xna box2d

我认为我已经将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);

     //...
        }
Run Code Online (Sandbox Code Playgroud)

以下是一些应用冲动的示例代码:

    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);
    }
Run Code Online (Sandbox Code Playgroud)

如果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);
Run Code Online (Sandbox Code Playgroud)

它可能是线性阻尼吗?我把它改成10.0f0,没有效果.

更新:线性阻尼的奇怪之处:我已经使用上面的应用脉冲方法对身体进行了这些观察:

Linear Damping       Max Speed
0f                   120
10f                  120
50f                  120
55f                  90
60f                  0
70f                  0
100f                 0
100000f              0
Run Code Online (Sandbox Code Playgroud)

为什么在50f和之间的线性阻尼存在一定范围的灵敏度60f

小智 15

这不是解决这个问题的方法.您应该在box2D世界中创建它们时缩小对象.然后你可以扩展box2D给你的信息回到你的世界的大小.

比方说,我的世界中的一个盒子长120像素.如果我将对象缩小30倍以便可以通过box2d正确模拟,那么box2D世界中我的框的长度将是4"像素"长(120/30或对象/比例的大小).现在,让我们说box2D计算我的盒子在box2d世界中移动了3个"像素".然后,我可以获取该信息并将其缩放到我的世界大小,这意味着该框只移动了90像素(3*30).我希望这听起来不会太混乱.我通常觉得很难解释自己.

  • +1.从Box2D手册:"Box2D针对MKS单元进行了调整.保持移动物体的大小大致在0.1到10米之间.当你渲染环境和演员时,你需要使用一些缩放系统.Box2D测试平台通过使用一个OpenGL视口转换." 使用引擎示例,例如.HelloWorld引用你自己的单位. (5认同)

小智 3

我对版本 2.1a 也有同样的问题,我发现更改 b2Settings.as 中的第 128 行可以提供帮助。将 static public const b2_maxTranslation:Number = 2.0 更改为更大的数字。确信这不是正确的方法,但现在不知道如何正确执行。

  • 我今天刚刚遇到这个问题,除了我使用的是 Box2D 的 C++ 版本。评论中写道:“物体的最大线速度。这个限制非常大,用于防止数值问题。你不需要调整它。” 我的模拟设置为 1 像素等于 1 Box2D 单位。我在速度上限方面遇到了同样的问题。听起来 Box2D 希望您将模拟保持在较小的规模。 (9认同)