c++ - 车身角度不变 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);
解决方案
具有零密度夹具的物体表现得像无限质量是正常的。听起来这不是你想要的。
查看呈现的代码,我们看到carFix.density
andheadFix.density
被设置为0.0f
. 将它们设置为一个正的非零值,例如1.0f
,并且创建它们的动态物体的行为应该更像一个物理质量。这是假设在该身体上创建的所有其他固定装置也具有大于零的密度。
有关夹具和密度的教程,我建议您查看 iforce2d 的Box2D C++ 教程 - Fixtures。
希望这可以解决问题或至少有所帮助。
顺便说一句,我喜欢视频中展示的艺术品!
推荐阅读
- javascript - 在 Vue.js 中使用 $state 的最佳方式是什么?
- python - Azure Durable 函数 python DurableOrchestrationContext get_input 返回 null
- java - 将数组打印到控制台时是否可以隐藏数组中的元素?
- python - 在python中使用plotly的地震jsondata的Scattergeo
- javascript - 在 Mongoose 分页时更新 Javascript 函数
- html - 可见性属性在 html 文件中不起作用
- java - 如何在 Android 中不是 Activity 类的其他类中使用 Firebase Analytics?
- javascript - 当源是来自 Django 的字典时,使用预取 + 远程的 Typeahead Bloodhound 自动完成
- python - 使用 tkinter 在屏幕上显示图像的问题
- python - 当一个线程需要来自其他线程之一的结果时如何运行多个线程