[英]How to combine Box2d bodies?
我的纹理不仅是盒子或圆形,而且我的身体必须与该形状相同,所以我想将多个身体结合起来以达到自己想要的形状,这有可能吗? 还是有更好的方法呢? 我在libgdx框架中使用Java。
实体的形状由Fixture实例定义。 由于主体可以具有多个固定装置,因此您可以根据需要组合多种形状。
要创建许多灯具,您可以与其他FixtureDef对象(例如)多次调用createFixture方法
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, ...});
要加入实体,可以使用“ 联合” (在这里看看)机制,但是我想这不是您想要的
是的,您可以按照以下步骤操作
有适合您工作的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的一部分。 即使它是固定边界并且永远不会移动,也必须将其附加。
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示例,直到找到所需的效果。
这样,我可以找到以下示例:
每个主体有多个固定装置,如https://stackoverflow.com/a/35667538/895245所述 :
到目前为止,这是我见过的最好的方法。
ChainShape
: https : //github.com/erincatto/Box2D/blob/f655c603ba9d83f07fc566d38d2654ba35739102/Box2D/Testbed/Tests/CharacterCollision.h#L56但是,如果形状的边缘之一不是直线,则无法使用一个圆圈。
WeldJoint
: https : //github.com/erincatto/Box2D/blob/f655c603ba9d83f07fc566d38d2654ba35739102/Box2D/Testbed/Tests/Cantilever.h
但是,这不能使两个实体完全接合,如示例本身以及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);
创建盒子(矩形或正方形)形状。
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.