C# Box2d:最大可能线速度?

C# Box2d:最大可能线速度?,c#,xna,box2d,C#,Xna,Box2d,我想我已经将Box2d配置为对任何物体都有某种最大速度,但我不确定。我施加了一种类似于(100000000,100000000)的冲动,身体的移动速度与(100100)一样快,但根本没有那么快 我使用的是Box2d XNA C#端口 我的游戏是自上而下的2d 以下是一些可能相关的代码: private readonly Vector2 GRAVITY = new Vector2(0, 0); public void initializePhysics(ContactReporter c

我想我已经将Box2d配置为对任何物体都有某种最大速度,但我不确定。我施加了一种类似于
(100000000,100000000)
的冲动,身体的移动速度与
(100100)
一样快,但根本没有那么快

我使用的是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);
    }
如果
常数.PLAYER\u pulse\u常数
1000f
1000000000f
之间,玩家最多可以移动
(-120,-120)
(120120)
。如果常数较小,如
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

为什么线性阻尼在
50f
60f
之间有一个灵敏度范围?

2.1a版也有同样的问题 我发现在b2Settings.as中更改第128行会有所帮助。 将静态公共常量b2_maxTranslation:Number=2.0更改为更高的数字。
当然,这不是正确的方法,但现在我真的不知道如何正确操作。

这不是解决问题的方法。在box2D世界中创建对象时,应该缩小对象的比例。然后,您可以将box2D提供的信息缩放回您的世界大小


比如说,在我的世界里,一个盒子有120像素长。如果我将对象缩小30倍,以便box2d可以正确模拟它,那么我的长方体在box2d世界中的长度将为4“像素”(120/30或对象大小/比例)。现在,假设box2D计算出我的盒子在box2D世界中移动了3个“像素”。然后,我可以抓取这些信息并将其缩放到我的世界大小,这意味着这个盒子只移动了90像素(3*30)。我希望这听起来不要太混乱。我通常很难解释自己。

应用冲动的代码可能会很有用。+1可以抵消投票反对的人。这是一个合理的问题。我今天刚刚遇到这个问题,除了我使用的是BX2D的C++版本。评论写道:“物体的最大线速度。这个极限非常大,用于防止数值问题。你不需要调整它。”我的模拟设置为1像素等于1 Box2D单位。我在速度封顶方面也有同样的问题。听起来Box2D希望您将模拟保持在较小的规模。是的,您可以这样做,但这不是正确的方法。见罗伯特的答案。我也有同样的问题,缩小我模拟的大小可以解决问题。+1。来自Box2D手册:“Box2D针对MKS单位进行了调整。将移动对象的大小保持在大约0.1到10米之间。渲染环境和角色时,需要使用一些缩放系统。Box2D测试台通过使用OpenGL视口变换来实现这一点。”使用引擎示例(例如HelloWorld)参照您自己的单位。