Угол кузова автомобиля не меняется box2D C ++ - PullRequest
0 голосов
/ 23 ноября 2018

Я создаю игру с боковой прокруткой с box2D.В настоящее время я работаю над машиной, и кажется, что я застрял.Шасси моей машины не вращается, когда, например, машина пытается подняться на холм.Я не знаю, нормально ли это, или я должен установить угол тела.Вот короткое видео, которое показывает проблему: https://streamable.com/d802n

Это мой код:

b2BodyDef carBox = b2BodyDef();
carBox.position = b2Vec2(bodyCenterPosition.x, bodyCenterPosition.y);
carBox.type = b2_dynamicBody;
car = game->getWorld()->CreateBody(&carBox);

b2PolygonShape carPolygon = b2PolygonShape();
carPolygon.SetAsBox(bodySize.x, bodySize.y);
b2FixtureDef carFix = b2FixtureDef();
carFix.density = 0.0f;
carFix.shape = &carPolygon;
car->CreateFixture(&carFix);

b2PolygonShape headPolygon = b2PolygonShape();
headPolygon.SetAsBox(headSize.x, headSize.y);
for (int i = 0; i < 8; i++) {
    headPolygon.m_vertices[i].x -= 8.0f / RATIO;
    headPolygon.m_vertices[i].y -= 24.0f / RATIO;
}
b2FixtureDef headFix = b2FixtureDef();
headFix.density = 0.0f;
headFix.shape = &headPolygon;
car->CreateFixture(&headFix);


b2CircleShape circleShape;
circleShape.m_radius = 0.35f;
circleShape.m_p.SetZero();

b2FixtureDef fd;
fd.shape = &circleShape;
fd.density = 1.0f;
fd.friction = 0.9f;

b2BodyDef wheel1Def;
wheel1Def.type = b2_dynamicBody;
wheel1Def.position = b2Vec2(backWheelCenterPosition.x, backWheelCenterPosition.y);
backWheel = game->getWorld()->CreateBody(&wheel1Def);
backWheel->CreateFixture(&fd);

b2BodyDef wheel2Def;
wheel2Def.type = b2_dynamicBody;
wheel2Def.position = b2Vec2(frontWheelCenterPosition.x, frontWheelCenterPosition.y);
frontWheel = game->getWorld()->CreateBody(&wheel2Def);
frontWheel->CreateFixture(&fd);

b2WheelJointDef springDef1;
springDef1.dampingRatio = 50.0f;
springDef1.maxMotorTorque = 1.0f;
springDef1.frequencyHz = 15.0f;
springDef1.motorSpeed = 0.0f;
springDef1.enableMotor = true;
springDef1.Initialize(car, backWheel, backWheel->GetPosition(), sfVecToB2Vec(sf::Vector2f(0.0f, 1.0f)));
backSpring = (b2WheelJoint*) game->getWorld()->CreateJoint(&springDef1);

springDef1.Initialize(car, frontWheel, frontWheel->GetPosition(), sfVecToB2Vec(sf::Vector2f(0.0f, 1.0f)));
frontSpring = (b2WheelJoint*) game->getWorld()->CreateJoint(&springDef1);

1 Ответ

0 голосов
/ 25 ноября 2018

Это нормально для тела с приспособлением, имеющим нулевую плотность, вести себя как бесконечная масса.Похоже, что это не то, что вы хотели.

Глядя на представленный код, мы видим, что carFix.density и headFix.density устанавливаются на 0.0f. Установите для них положительное ненулевое значение , например 1.0f, и динамическое тело, на котором они созданы, должно вести себя больше как физическая масса.Это при условии, что все другие приборы, созданные на этом теле, также имеют плотность, которая больше нуля.

Для учебника по приборам и плотности я бы рекомендовал взглянуть на Box2D C ++ iforce2d.учебные пособия - Светильники .

Надеюсь, что это решит проблему или, по крайней мере, поможет.

Кстати, мне понравилось изображение, показанное в видео!

...