【问题标题】:Box2d: Maximum possible linear velocity?Box2d:最大可能的线速度?
【发布时间】:2010-04-05 02:49:55
【问题描述】:

我想我已经将 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 之间存在线性阻尼的灵敏度范围?

【问题讨论】:

  • 应用冲动的代码可能有用。
  • +1 以抵消投票否决的人。这是一个合理的问题。

标签: c# xna box2d


【解决方案1】:

这不是解决问题的方法。在 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 参考您自己的单位。
【解决方案2】:

我对 2.1a 版也有同样的问题 我发现在 b2Settings.as 中更改第 128 行会有所帮助。 将 static public const b2_maxTranslation:Number = 2.0 更改为更高的数字。 确定这不是正确的方法,但现在真的不知道如何正确地做到这一点。

【讨论】:

  • 我今天刚遇到这个问题,除了我使用的是C++版本的Box2D。 cmets 读到:“物体的最大线速度。这个限制非常大,用于防止出现数值问题。你不需要调整它。”我的模拟设置为 1 个像素等于 1 个 Box2D 单位。我在速度上限方面遇到了同样的问题。听起来 Box2D 喜欢您将模拟保持在较小的范围内。
  • 是的,您可以这样做,但这不是正确的方法。请参阅罗伯特的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多