WedX - журнал о программировании и компьютерных науках

setAngularVelocity вращается очень медленно

Я использую базовый libgdx box2d для управления физическими операциями в игре. Все работает правильно, кроме вращений: даже когда я устанавливаю

anyobject.body.setAngularVelocity(someLargeConstant);

объект вращается очень медленно (и почти с той же скоростью), независимо от того, что такое «someLargeConstant». За исключением случаев, когда я использую маленькие числа для параметра, он может вращаться медленнее. Таким образом, я думаю, что у меня каким-то образом есть константа максимальной угловой скорости внутри моего объекта мира, которая должна быть установлена ​​​​на какое-то небольшое значение.

(У меня также была аналогичная проблема с линейной скоростью раньше, и я решил ее, отрегулировав масштаб пикселей/метр. Так что маловероятно, что проблема связана с масштабированием.)

Как сделать так, чтобы объекты вращались быстрее?

Вот код, который я использую:

private static World world = new World(new Vector2(0, 0), true);   //Create a world with no gravity

для создания объекта я вызываю другой класс

 public Object(World world, short category, short mask, float x, float y, float radius, Sprite image, 
        float maxSpeed, float frictionStrength, float linearDamping, float angularDamping, boolean movable,
        float elasticity, float mass){

    this.world = world; 
    this.category = category;
    this.mask = mask;
    // We set our body type
    this.bodyDef = new BodyDef();
    if(movable==true){bodyDef.type = BodyType.DynamicBody;}else{bodyDef.type = BodyType.StaticBody;}
    // Set body's starting position in the world
    bodyDef.position.set(x, y);
    bodyDef.linearDamping = linearDamping;
    bodyDef.angularDamping = angularDamping;
    // Create our body in the world using our body definition
    this.body = world.createBody(bodyDef);
    // Create a circle shape and set its radius
    CircleShape circle = new CircleShape();
    circle.setRadius(radius);
    // Create a fixture definition to apply our shape to
    fixtureDef = new FixtureDef();
    fixtureDef.shape = circle;
    fixtureDef.density = (float) (mass/(Math.PI*radius*radius)); 
    fixtureDef.friction = frictionStrength;
    fixtureDef.restitution = elasticity;
    fixtureDef.filter.categoryBits = category;
    fixtureDef.filter.maskBits = mask;
    // Create our fixture and attach it to the body
    this.fixture = body.createFixture(fixtureDef);
    // BodyDef and FixtureDef don't need disposing, but shapes do.
    circle.dispose();

    ... unrelated functions after that
    }

и здесь я просто пытаюсь заставить его вращаться быстро:

    tempBall.body.setAngularVelocity(20000);
16.02.2015

  • Мы не можем понять, что может быть причиной проблемы, если вы не опубликуете код. Проблема не в самом методе, поэтому она должна быть где-то еще. 16.02.2015
  • Я просто добавил все, что связано 16.02.2015
  • Попробуйте жестко запрограммировать свои linearDamping и angularDamping на 0. Таким образом, bodyDef.linearDamping = 0; bodyDef.angularDamping = 0; и посмотреть, что происходит. 16.02.2015
  • нет к сожалению не помогло 16.02.2015
  • Убедитесь, что значение movable равно true. Попробуйте изменить значения в вашем FixureDef и посмотрите, что произойдет. 16.02.2015
  • Раньше я много играл с величинами, но они кажутся неуместными при такой максимальной угловой скорости. Movable всегда верно, иначе у меня были бы проблемы с линейным перемещением в первую очередь. 16.02.2015
  • Я предполагаю, что вы интерпретируете радианы как градусы при рендеринге. Box2D накладывает верхний предел угловой скорости в 0,5 радиана (90 градусов) на временной шаг. При 60 кадрах в секунду это будет 30 радиан в секунду, что очень быстро, но если вы используете это как градусы, то это 30 градусов в секунду, что не так быстро. Приблизительно с какой скоростью, по вашему мнению, вращается объект? 18.02.2015
  • На самом деле это звучит вполне логично, есть ли способ преобразовать одно в другое? На один оборот уходит около 4 секунд, поэтому он должен составлять около 90 градусов в секунду. Использую 30фпс (точнее обновляю через world.step(1/30f, 8, 3);). 18.02.2015
  • Кажется, что это не зависит от временного шага (и итераций скорости и положения). Точнее, для совершения полного оборота требуется 3,86 (+- 0,03) секунды. Так что скорее всего причина в другом. 25.02.2015

Ответы:


1

angularvilocity используется для установки направления вращения, когда дело доходит до использования его с actionListener как клавиша или список мыши, вот пример использования:

 case KeyEvent.VK_RIGHT:
              ball.setAngularVelocity(-20); // Directly set the angular velocity

case KeyEvent.VK_LEFT:
              ball.setAngularVelocity(20); // Directly set the angular velocity

как вы можете видеть здесь, код заставляет корпус мяча вращаться вправо при нажатии Key_Right и влево при нажатии Key_Left, и я могу поиграть с его аргументом, чтобы увеличить или уменьшить скорость вращения, и это работает очень хорошо для меня, здесь это мое определение body, попробуйте применить те же значения, и оно должно работать без проблем:

private Body createObject(Shape shape, BodyType type, Vec2 position, float orientation, Sprite sprite) throws InvalidSpriteNameException {
           for(Sprite s:spriteList) {
            if(s.getName().equals(sprite.getName())) {
                throw new InvalidSpriteNameException(sprite.getName()+" already used.");
            }
           }
        Body body = null;
        FixtureDef fixDef = new FixtureDef();
        fixDef.shape = shape;
        fixDef.density = 0.1f;
        fixDef.isSensor = false;
        fixDef.restitution = 0.1f;

        BodyDef bodyDef = new BodyDef();
        bodyDef.type = type;

        bodyDef.angularDamping = 0.1f;
        bodyDef.linearDamping = 0.1f;

        bodyDef.fixedRotation = false;
        bodyDef.gravityScale = 1f;

        bodyDef.linearVelocity = new Vec2(0,0);
        bodyDef.angularVelocity = 0;
        bodyDef.position = new Vec2(position);
        bodyDef.angle = orientation;
        bodyDef.allowSleep = true;
        spriteList.add(sprite); // Save the sprite to the list (sprites must be serialiazed in the PhysicalWorld)
        bodyDef.userData = sprite; // Link the body and the sprite

        do {
            body = jBox2DWorld.createBody(bodyDef);
        } while(body== null); // Wait until the object is really created
        sprite.linkToBody(body); // Link the body to the sprite (this link is not serialiazed)
        body.createFixture(fixDef);
        return body;
    }
16.02.2015
  • Спасибо, я просмотрю код, я уверен, что этого будет достаточно, чтобы найти источник проблемы. 18.02.2015
  • Честно говоря, я использовал точно такой же код, и это не имело никакого значения. Это довольно просто, может быть причина в том, как я инициализирую мир или что-то в этом роде? 25.02.2015

  • 2

    Я только что нашел проблему, и это было довольно просто. Я просто собираюсь опубликовать это здесь для будущих пользователей Google:

    Объект на самом деле вращался правильно, проблема была в моем методе рисования, я не использовал преобразование между радианами в градусы в моем пакете.draw, и он интерпретировал все в радианах. Я знаю, такая дилетантская ошибка! Большое спасибо за ваше время.

    26.02.2015
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]