车身角度不变box2D C ++

时间:2018-11-23 20:05:45

标签: c++ box2d game-physics

我正在使用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 :(得分:0)

具有固定密度为零的固定装置的物体的行为就像无限质量,这是正常的。听起来那不是您想要的。

查看提供的代码,我们发现statfile = os.stat(filename) filesize = statfile.st_size if filesize == 0: #manage here the 'faulty image' case carFix.density被设置为headFix.density将它们设置为非零正值,例如0.0f,并且在其上创建的动态物体的行为应更类似于物理质量。假设在该物体上创建的所有其他灯具的密度也都大于零。

有关固定装置和密度的教程,我建议您看一下iforce2d的Box2D C++ tutorials - Fixtures

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

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