如何组合 Box2d 物体?

How to combine Box2d bodies?

我的纹理不只是一个盒子或圆形,我的 body 需要与这个形状相同,所以我想结合多个物体来实现我想要的形状,是否有可能?或者有更好的方法吗?我正在使用 java 和 libgdx 框架。

body 的形状由 Fixture 实例定义。由于 body 可以有多个灯具,您可以根据需要组合许多形状。

要创建许多灯具,您可以与其他人一起多次调用 createFixture 方法 FixtureDef objects like

FixtureDef fd1 = new FixtureDef();
FixtureDef fd2 = new FixtureDef();

...
fd1.shape = shape1;
fd2.shape = shape2;
...

body.createFixture(fd1);     
body.createFixture(fd1);

尽管 请注意 Box2D 支持的不仅仅是圆形和矩形 通过提供 ChainShape 允许您创建任何您想要的形状

ChainShape weird = new ChainShape();
weird.createLoop( new float[]{vertice1x, vertice1y, vertice2x, ...});

加入身体有联合(看看here)机制,但我想这不是你想要的

是的,您可以按照以下步骤操作

有适合您作品的PolygonShape或ChainShape选项

第 1 步:定义主体。

BodyDef bd = new BodyDef();
Body body = box2d.world.createBody(bd);

第 2 步:定义形状。

ChainShape chain = new ChainShape();

第 3 步:配置形状。 ChainShape 对象是一系列相连的顶点。要创建链,我们必须首先指定一个顶点数组(每个顶点都是一个 Vec2 对象)。 为了创建带有顶点的链,然后将数组传递给一个名为

的函数
createChain().Vec2[] vertices = new Vec2[2];
vertices[0] = box2d.coordPixelsToWorld(0,150); 
vertices[1] = box2d.coordPixelsToWorld(width,150);
chain.createChain(vertices, vertices.length);

Shape 不是 Box2D 的一部分,除非它附加到 body 上。就算是固定的界线,从不移动,也必须依附。

FixtureDef fd = new FixtureDef();
fd.shape = chain; A fixture assigned to the ChainShape
fd.density = 1;
fd.friction = 0.3;
fd.restitution = 0.5;
body.createFixture(fd);

多边形

PolygonShape ps = new PolygonShape();
ps.setAsBox(box2dW, box2dH);
Vec2[] vertices = new Vec2[4]; 
vertices[0] = box2d.vectorPixelsToWorld(new Vec2(-15, 25));
vertices[1] = box2d.vectorPixelsToWorld(new Vec2(15, 0));
vertices[2] = box2d.vectorPixelsToWorld(new Vec2(20, -15));
vertices[3] = box2d.vectorPixelsToWorld(new Vec2(-10, -10));
PolygonShape ps = new PolygonShape(); 
ps.set(vertices, vertices.length);

官方测试平台示例

我强烈建议您查看 GUI 上的所有 Testbed 示例,直到找到您正在寻找的效果。

通过这样做,我找到了以下示例:

这些示例非常简单,随着 Box2D 的发展将得到支持。

要创建不同的形状,您可以从这些示例中获得灵感:

  1. 创建圆形。

    bodyDef.type = b2Body.b2_dynamicBody;
    var fixDef = new b2FixtureDef;
    fixDef.density = 1000;
    fixDef.friction = 0.5;
    fixDef.restitution = 0.5;       
    fixDef.shape = new b2CircleShape(0.5);
    bodyDef.position.x = 1;
    bodyDef.position.y = 16;
    world.CreateBody(bodyDef).CreateFixture(fixDef);
    
  2. 创建盒子(矩形或正方形)形状。

    var fixDef = new b2FixtureDef;
    fixDef.density = 100;
    fixDef.friction = 5;
    fixDef.restitution = 0.5;
    bodyDef.type = b2Body.b2_dynamicBody;
    fixDef.shape = new b2PolygonShape;
    fixDef.shape.SetAsBox(0.2,1);
    bodyDef.position.x =i;
    bodyDef.position.y = 15.5;
    world.CreateBody(bodyDef).CreateFixture(fixDef);
    
  3. 创建拆箱形状(多边形)。

    bodyDef.type = b2Body.b2_dynamicBody;
    fixDef.shape = new b2PolygonShape;
    fixDef.shape.SetAsArray([
        new b2Vec2(-1,0.5),//left vertex
        new b2Vec2(3,-0.3),//top vertex
        new b2Vec2(3,0.5),//right vertex
     ],3);
    bodyDef.position.x =5;
    bodyDef.position.y = 16;
    world.CreateBody(bodyDef).CreateFixture(fixDef);