[英]box2d: simple example not simulating correctly
我是 box2d 的新手,並且正在按照在線教程之一將一些盒子放入場景並讓它們掉落。 項目代碼非常簡單:
在模擬循環之前,創建了一個世界並將一些框添加到場景中:
m_Physics = new Pistachio::Physics();
m_Physics->addBox(glm::vec2(0.0f, -90.0f), 0, glm::vec2(200.0f, 1.0f), false);
m_Physics->addBox(glm::vec2(0.0f, 0.0f), 0, glm::vec2(30.0f, 30.0f));
m_Physics->addBox(glm::vec2(30.0f, 40.0f), 0, glm::vec2(40.0f, 10.0f));
定義為:
Physics::Physics() {
m_Gravity = b2Vec2(0.0f, -9.8f);
m_PysicsWorld = new b2World(m_Gravity);
}
void Physics::addBox(const glm::vec2& position, float rotation, const glm::vec2& dimensions, bool dynamic) {
m_Boxes.push_back(Box(m_PysicsWorld, position, rotation, dimensions, dynamic));
}
Box::Box(b2World* world, const glm::vec2& position, float rotation, const glm::vec2& dimensions, bool dynamic) {
m_Width = dimensions.x;
m_Height = dimensions.y;
// make body
b2BodyDef bodyDef;
bodyDef.type = (dynamic) ? b2_dynamicBody : b2_staticBody;
bodyDef.position.Set(position.x, position.y);
bodyDef.angle = rotation;
bodyDef.fixedRotation = false;
m_Body = world->CreateBody(&bodyDef);
// make fixture
b2PolygonShape boxShape;
boxShape.SetAsBox(m_Width / 2.0f, m_Height / 2.0f);
b2FixtureDef fixtureDef;
fixtureDef.shape = &boxShape;
fixtureDef.density = (dynamic) ? 1.0f : 0.0f;
fixtureDef.friction = 0.5f;
fixtureDef.restitution = 0.1f;
fixtureDef.restitutionThreshold = 0.5f;
m_Fixture = m_Body->CreateFixture(&fixtureDef);
}
這些盒子能夠以正確的位置和大小正確地添加到世界中。 然后在模擬循環中,世界執行步進模擬並為盒子發出一些繪制調用。
void Sandbox2D::OnUpdate(Timestep ts) {
// step simulate world
m_Physics->getWorld()->Step(1/60.0f, 6, 2);
// Update
m_CameraController.OnUpdate(ts);
// draw calls
Renderer2D::BeginScene(m_CameraController.GetCamera());
for (int i = 0; i < 3; i++) {
m_Physics->getObjectByIndex(i).Draw({ 0.2f, 0.8f, 0.3f, 1.0f });
}
Renderer2D::EndScene();
}
一切都可以運行,兩個動態類型的盒子會掉在靜態地面上,但是它們的碰撞和物理模擬不正確。 接觸點位置潮濕,由於碰撞,盒子似乎無法正確旋轉。 他們也移動得很慢。
我認為這是一個非常簡單的演示,但我沒有做對。 設置 box2d 時還有什么需要注意的嗎?
沒關系。 弄清楚了...
一定要檢查你的角度,它們應該是弧度而不是度數......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.