在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 1body 2的位置是(0, 0)。我认为应该在第二步之后自动将第二局置于(1, 1),它不应该移动这两个物体。

+3

At> 100 rep,你应该知道你应该发布代码,而不是代码链接。 – molbdnilo

+0

@molbdnilo我会尽量减少代码行并将其发布到这里,但我不知道*会接受它。 –

+0

@molbdnilo谢谢。 –

代码未设置b2BodyDefposition领域,因此这两个机构越来越在Vec2(0, 0)(在b2Body.h文件每b2BodyDef结构定义)的默认位置,其中心创建的。根据你的代码设置localAnchorAlocalAnchorB的位置,我怀疑你创建的机构代码需要更多这样的:

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); 

这样你bodypolygonShapeVec2(0.0f, 0.0f)为中心,您的body2polygonShape2在居中前者形状的右上角,和定位点,加入两个身体就在那里在同一个角落(世界位置Vec2(1.0f, 1.0f))。