Java 如何组合Box2d实体?

Java 如何组合Box2d实体?,java,libgdx,box2d,Java,Libgdx,Box2d,我有一个纹理,它不仅仅是一个盒子或圆圈,我的身体需要与这个形状相同,所以我想把多个身体结合起来,以达到我想要的形状,这可能吗?还是有更好的方法?我将java与libgdx框架一起使用。身体的形状由实例定义。因为主体可以有多个固定装置,所以可以根据需要组合许多形状 要创建许多装置,您可以多次调用createFixture方法来创建其他对象,如 FixtureDef fd1 = new FixtureDef(); FixtureDef fd2 = new FixtureDef(); ... fd1

我有一个纹理,它不仅仅是一个盒子或圆圈,我的身体需要与这个形状相同,所以我想把多个身体结合起来,以达到我想要的形状,这可能吗?还是有更好的方法?我将java与libgdx框架一起使用。

身体的形状由实例定义。因为主体可以有多个固定装置,所以可以根据需要组合许多形状

要创建许多装置,您可以多次调用createFixture方法来创建其他对象,如

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

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

body.createFixture(fd1);     
body.createFixture(fd1);
尽管请注意,通过提供允许您创建所需形状的选项,Box2D支持的不仅仅是圆和矩形

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

要连接身体,有关节(看一看)机制,但我想这不是你想要的

是的,你可以按照下面的步骤来做

有一个适合您工作的多边形形状或链状形状选项

步骤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);
除非形状附着到实体,否则它不是Box2D的一部分。即使它是一个固定的边界且从不移动,也必须将其附着

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上的所有测试床示例,直到找到所需的效果

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

  • 每个车身有多个固定装置,如所述:

    这是迄今为止我见过的最好的方法

  • ChainShape
    :但如果形状的一条边不是直线,例如圆,则此操作无效

  • 焊接接头:

    但是,这并不能使两个实体完全连接,如示例本身和Box2D手册中所示:

    使用焊接接头来定义易碎结构很有诱惑力。但是,Box2D解算器是迭代的 所以关节有点软。因此,通过焊接接头连接的身体链将发生弯曲

    所以它更像是一个旋转关节,试图以给定的角度离开两个物体


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

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

  • 创建圆形

    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);
    
  • 创建长方体(矩形或方形)形状的步骤

  • 创建取消装箱形状(多边形)的步骤


  • 最后一部分的目的是什么?如果已设置fixtureShape=链,则将其指定给实体。最后一部分是与链形状分离的多边形形状。提供了小代码,这样您也可以了解其他形状。
    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);
    
    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);