车身角度不改变box2D C ++

问题描述 投票:0回答:1

我正在用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++ box2d game-physics
1个回答
0
投票

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

看看提供的代码,我们看到carFix.densityheadFix.density被设置为0.0f。将它们设置为正的非零值,如1.0f,并且它们创建的动态体应该表现得更像物理质量。假设在该主体上创建的所有其他灯具的密度也大于零。

关于灯具和密度的教程,我建议你看看iforce2d的Box2D C++ tutorials - Fixtures

希望这能解决问题或者至少有所帮助。

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

© www.soinside.com 2019 - 2024. All rights reserved.