Box2D Как остановить вращение Player (Box)

Итак, у меня есть плеер (Box2D box), который можно перемещать по горизонтали с помощью "A" и "D", используя:

 SetLinearVelocity(b2Vec2(speed,  object.getB2Object()->GetLinearVelocity().y));

Но когда я перемещаю коробку, игрок не скользит, а играет роли по углам, вот так:

введите описание изображения здесь

Я понял, что уменьшение трения коробки и земли в некоторой степени предотвращает это, но все же происходит довольно регулярно, а также заставляет игрока скользить дальше при остановке. Я попробовал функцию SetFixedRotation (true), но это, кажется, заставляет игрока перестать двигаться все вместе, предположительно в точках, где он собирался вращаться. Я также попробовал SetAngularVelocity(0), но это все равно заставляет окно вращаться, хотя и очень медленно. Есть ли другой способ предотвратить вращение плеера при движении по поверхности? Спасибо

[Редактировать]

После того, как pingul предложил установить трение на ноль, коробка почти не вращалась. Это выглядело так, как будто он споткнулся о чем-то очень часто, поэтому вместо 10 отдельных плиток для пола я удалил их и создал широкую плитку, и проблема прекратилась! Поэтому я думаю, что коробка сработала на следующей плитке. Моя следующая проблема заключается в том, почему это происходит, поскольку я знаю, что все плитки имеют одинаковую высоту, ширину и положение, как показано здесь:

//the number of tiles
const unsigned int MAX_TILES = 10;
for(int i = 0; i < MAX_TILES; i++){
                                 //position                       ,size           ,density    ,linear_damping ,friction ,isdynamic,b2World                                    
    tiles.push_back(new GameObject(vec3(6+i-(MAX_TILES/2), -10, 1),  vec3(1, 1, 0),   1.0f    ,1.0f           ,0.5f      ,false   ,world_b2));
    tiles[tiles.size()-1]->Init(); //Some OpenGL stuff for rendering
    tiles[tiles.size()-1]->getMesh()->setTexture(test_sheet.getTexture(2,0)); //gets a texture from sprite sheet class
}

[Редактировать 2]

Math Library Использование: GLM

Наложение плиток в горизонтальном направлении ничего не дает, но я думаю, что это как-то связано с вертикальной осью. Когда игрок переходит к другой плитке, вращается или нет, значение у слегка меняется. Это может быть как вверх, так и вниз, и может изменяться только на +-0,003~. Хотя при прыжке он вернется к самому первому значению, когда игра начнется на любой плитке пола.

1 ответ

В классе тела (Box2D) есть две функции, которые могут помочь вам с нежелательным вращением, которое вы получаете. Первое:

void SetFixedRotation(bool flag)

Желание позволит вам зафиксировать вращение.

void SetAngularDamping(float32 angularDamping)

Желание установит величину углового сопротивления, которая зависит от аргумента, который вы передаете функции. Я рекомендую прочитать официальную документацию Box2D, "Глава 6: Тела" даст вам больше информации о положении и угле (см. стр. 29 и 30 Демпфирование и Fixed Rotation) или хотя бы краткий обзор класса box2d b2Body. Надеюсь, это поможет вам

Я не знаю, какую векторную библиотеку вы используете, но я бы предположил, vec3 принимает плавающие или удваивается в качестве аргументов. преобразование vec3(6+i-(MAX_TILES/2) чтобы число с плавающей запятой могло привести к небольшому промежутку между объектами.

Могут ли объекты перекрывать небольшое количество? Что произойдет, если вы измените size в vec3(1.0001, 1, 0)?

Другие вопросы по тегам