首页 > 解决方案 > 车身角度不变 box2D C++

问题描述

我正在用 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);

标签: c++box2dgame-physics

解决方案


具有零密度夹具的物体表现得像无限质量是正常的。听起来这不是你想要的。

查看呈现的代码,我们看到carFix.densityandheadFix.density被设置为0.0f. 将它们设置为一个正的非零值,例如1.0f,并且创建它们的动态物体的行为应该更像一个物理质量。这是假设在该身体上创建的所有其他固定装置也具有大于零的密度。

有关夹具和密度的教程,我建议您查看 iforce2d 的Box2D C++ 教程 - Fixtures

希望这可以解决问题或至少有所帮助。

顺便说一句,我喜欢视频中展示的艺术品!


推荐阅读