在C++的Box2D中添加关节后,主体会改变其位置
问题描述:
当我在两个主体之间创建关节时,它们的位置发生变化。我不创造任何力量。在C++的Box2D中添加关节后,主体会改变其位置
代码:
#include <iostream>
#include <Box2D/Box2D.h>
int main() {
// WORLD
b2World world(b2Vec2(0, 0));
// BODY DEF
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
// SHAPES
b2PolygonShape polygonShape;
polygonShape.SetAsBox(1, 1);
b2PolygonShape polygonShape2;
polygonShape2.SetAsBox(0.5, 0.5);
// BODY 1
b2Body* body = world.CreateBody(&bodyDef);
b2Fixture* fixture = body->CreateFixture(&polygonShape, 1);
// BODY 2
b2Body* body2 = world.CreateBody(&bodyDef);
b2Fixture* fixture2 = body2->CreateFixture(&polygonShape2, 1);
// JOINT
b2RevoluteJointDef jointDef;
jointDef.bodyA = body;
jointDef.localAnchorB.SetZero();
jointDef.bodyB = body2;
jointDef.localAnchorA.Set(1, 1);
b2Joint* joint = world.CreateJoint(&jointDef);
// LOGS (X POSITION)
std::cout << "[ body 1 ] " << body->GetPosition().x << std::endl;
std::cout << "[ body 2 ] " << body2->GetPosition().x << std::endl;
world.Step(1/50.0f, 8, 3);
std::cout << "[ body 1 ] " << body->GetPosition().x << std::endl;
std::cout << "[ body 2 ] " << body2->GetPosition().x << std::endl;
return 0;
}
输出(x position
):
[ body 1 ] 0 (before step)
[ body 2 ] 0
[ body 1 ] -0.2 (after step)
[ body 2 ] 0.8
,我认为它应该返回
[ body 1 ] 0 (before step)
[ body 2 ] 0
[ body 1 ] 0 (after step)
[ body 2 ] 1
也许什么是错在我的代码?我是Box2D的新手。我应该做些什么来获得预期的结果?
之前的步骤body 1
和body 2
的位置是(0, 0)
。我认为应该在第二步之后自动将第二局置于(1, 1)
,它不应该移动这两个物体。
答
代码未设置b2BodyDef
position
领域,因此这两个机构越来越在Vec2(0, 0)
(在b2Body.h
文件每b2BodyDef
结构定义)的默认位置,其中心创建的。根据你的代码设置localAnchorA
和localAnchorB
的位置,我怀疑你创建的机构代码需要更多这样的:
b2BodyDef bodyDef1;
bodyDef1.type = b2_dynamicBody;
bodyDef1.position.Set(0.0f, 0.0f);
b2BodyDef bodyDef2;
bodyDef2.type = b2_dynamicBody;
bodyDef2.position.Set(1.0f, 1.0f);
...
b2Body* body = world.CreateBody(&bodyDef1);
...
b2Body* body2 = world.CreateBody(&bodyDef2);
这样你body
polygonShape
在Vec2(0.0f, 0.0f)
为中心,您的body2
polygonShape2
在居中前者形状的右上角,和定位点,加入两个身体就在那里在同一个角落(世界位置Vec2(1.0f, 1.0f)
)。
At> 100 rep,你应该知道你应该发布代码,而不是代码链接。 – molbdnilo
@molbdnilo我会尽量减少代码行并将其发布到这里,但我不知道*会接受它。 –
@molbdnilo谢谢。 –