Box2d: максимально возможная линейная скорость?

Кажется, я настроил Box2d так, чтобы он имел какую-то максимальную скорость для любого тела, но я не уверен. Я применяю импульс типа (100000000, 100000000), и тело движется так же быстро, как (100, 100), что совсем не так быстро.

Я использую порт C# Box2d XNA.

Моя игра 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 находится в диапазоне от 1000f до 1000000000f, игрок может переместить не более (-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

Почему существует диапазон чувствительности линейного демпфирования между 50f и 60f?


person Nick Heiner    schedule 05.04.2010    source источник
comment
Код, который применяет импульс, может быть полезен.   -  person Marcelo Cantos    schedule 05.04.2010
comment
+1, чтобы противодействовать тому, кто проголосовал против этого. Это законный вопрос.   -  person avpx    schedule 05.04.2010


Ответы (2)


У меня та же проблема с версией 2.1a, я обнаружил, что изменение строки 128 в b2Settings.as может помочь. Измените статическую общедоступную константу b2_maxTranslation:Number = 2.0 на большее число. уверен, что это неправильный путь, но сейчас действительно не знаю, как это сделать правильно.

person Gillis    schedule 05.04.2010
comment
Я только что столкнулся с этой проблемой сегодня, за исключением того, что я использовал версию Box2D для С++. Комментарии гласят: Максимальная линейная скорость тела. Этот предел очень велик и используется для предотвращения числовых проблем. Вам не нужно настраивать это. Моя симуляция была установлена ​​на 1 пиксель, равный 1 единице Box2D. У меня была такая же проблема с ограничением скорости. Похоже, Box2D хочет, чтобы вы сохраняли симуляцию в меньшем масштабе. - person don; 28.05.2010
comment
Да, вы можете сделать это, но это не правильный путь. См. ответ Роберта. - person Engineer; 02.08.2011

Это не способ решить эту проблему. Вы должны уменьшать масштаб своих объектов при их создании в мире box2D. Затем вы можете просто масштабировать информацию, которую дает вам box2D, до размера вашего мира.

Скажем, например, что коробка в моем мире имеет длину 120 пикселей. Если бы я уменьшил масштаб объекта в 30 раз, чтобы его можно было правильно смоделировать с помощью box2d, тогда длина моего блока в мире box2D составила бы 4 «пикселя» (120/30 или размер вашего объекта/масштаба). Теперь предположим, что box2D вычисляет, что моя коробка переместилась на 3 "пикселя" в мире box2d. Затем я мог бы получить эту информацию и масштабировать ее обратно до размера моего мира, что означало бы, что поле только что переместилось на 90 пикселей (3 * 30). Надеюсь, это не прозвучало слишком запутанно. Обычно мне трудно объяснить себя.

person Robert    schedule 29.12.2010
comment
У меня была та же проблема, и уменьшение размера моей симуляции исправило ситуацию. - person Nathan S.; 14.03.2011
comment
+1. Из руководства Box2D: Box2D настроен для блоков MKS. Держите размер движущихся объектов примерно между 0,1 и 10 метрами. Вам нужно будет использовать некоторую систему масштабирования при рендеринге среды и актеров. Испытательный стенд Box2D делает это с помощью преобразования окна просмотра OpenGL. Используйте примеры двигателей, например. HelloWorld, чтобы ссылаться на ваши собственные юниты. - person Engineer; 02.08.2011