public override void initTest(bool deserialized) { if (deserialized) { return; } Body[] bodies = new Body[e_count]; { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.createFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); shape.m_radius = 1.0f; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(0.0f, 4.0f + 3.0f*i); bodies[i] = getWorld().createBody(bd); bodies[i].createFixture(shape, 1.0f); // m_bodies[i].setLinearVelocity(new Vec2(0.0f, -100.0f)); } } }
public override Shape clone() { CircleShape shape = new CircleShape(); shape.m_p.x = m_p.x; shape.m_p.y = m_p.y; shape.m_radius = m_radius; return shape; }
public override void initTest(bool deserialized) { if (deserialized) { return; } Body pendulum; Body pendulumBase; Body ground; { CircleShape circleShape = new CircleShape(); circleShape.m_radius = 1; Shape shape = circleShape; BodyDef bodyDef = new BodyDef(); bodyDef.type = BodyType.DYNAMIC; bodyDef.position.set(-5, 0); bodyDef.allowSleep = false; pendulum = getWorld().createBody(bodyDef); pendulum.createFixture(shape, 1); } { PolygonShape shape = new PolygonShape(); shape.setAsBox(1, 1); BodyDef bodyDef = new BodyDef(); bodyDef.type = BodyType.DYNAMIC; bodyDef.position.set(0, 2); bodyDef.allowSleep = false; pendulumBase = getWorld().createBody(bodyDef); pendulumBase.createFixture(shape, 1); } { PolygonShape shape = new PolygonShape(); shape.setAsBox(3, 1); BodyDef bodyDef = new BodyDef(); bodyDef.type = BodyType.STATIC; ground = getWorld().createBody(bodyDef); ground.createFixture(shape, 0); } RevoluteJointDef jointDef = new RevoluteJointDef(); if (switchBodiesInJoint) jointDef.initialize(pendulum, pendulumBase, new Vec2(0, 0)); else jointDef.initialize(pendulumBase, pendulum, new Vec2(0, 0)); getWorld().createJoint(jointDef); }
public override void initTest(bool deserialized) { { { PolygonShape shape = new PolygonShape(); Vec2[] vertices = new Vec2[] {new Vec2(-40, -10), new Vec2(40, -10), new Vec2(40, 0), new Vec2(-40, 0)}; shape.set(vertices, 4); getGroundBody().createFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); Vec2[] vertices = {new Vec2(-40, -1), new Vec2(-20, -1), new Vec2(-20, 20), new Vec2(-40, 30)}; shape.set(vertices, 4); getGroundBody().createFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); Vec2[] vertices = {new Vec2(20, -1), new Vec2(40, -1), new Vec2(40, 30), new Vec2(20, 20)}; shape.set(vertices, 4); getGroundBody().createFixture(shape, 0.0f); } } m_world.setParticleRadius(0.35f); m_world.setParticleDamping(0.2f); { CircleShape shape = new CircleShape(); shape.m_p.set(0, 30); shape.m_radius = 20; ParticleGroupDef pd = new ParticleGroupDef(); pd.flags = ParticleType.b2_waterParticle; pd.shape = shape; m_world.createParticleGroup(pd); } { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; Body body = m_world.createBody(bd); CircleShape shape = new CircleShape(); shape.m_p.set(0, 80); shape.m_radius = 5; body.createFixture(shape, 0.5f); } }
public void createCircle() { float radius = 2.0f; CircleShape shape = new CircleShape(); shape.m_p.setZero(); shape.m_radius = radius; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 1.0f; fd.friction = 0.0f; Vec2 p = new Vec2((float) _random.NextDouble(), 3.0f + (float) _random.NextDouble()); BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position = p; //bd.allowSleep = false; Body body = getWorld().createBody(bd); body.createFixture(fd); }
public override void initTest(bool deserialized) { if (deserialized) { return; } { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.createFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); shape.m_radius = 1.0f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 1.0f; float[] restitution = {0.0f, 0.1f, 0.3f, 0.5f, 0.75f, 0.9f, 1.0f}; for (int i = 0; i < 7; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(-10.0f + 3.0f*i, 20.0f); Body body = getWorld().createBody(bd); fd.restitution = restitution[i]; body.createFixture(fd); } } }
// Compute contact points for edge versus circle. // This accounts for edge connectivity. public void collideEdgeAndCircle(Manifold manifold, EdgeShape edgeA, Transform xfA, CircleShape circleB, Transform xfB) { manifold.pointCount = 0; // Compute circle in frame of edge // Vec2 Q = MulT(xfA, Mul(xfB, circleB.m_p)); Transform.mulToOutUnsafe(xfB, circleB.m_p, ref temp); Transform.mulTransToOutUnsafe(xfA, temp, ref Q); Vec2 A = edgeA.m_vertex1; Vec2 B = edgeA.m_vertex2; e.set(B); e.subLocal(A); // Barycentric coordinates temp.set(B); temp.subLocal(Q); float u = Vec2.dot(e, temp); temp.set(Q); temp.subLocal(A); float v = Vec2.dot(e, temp); float radius = edgeA.m_radius + circleB.m_radius; // ContactFeature cf; cf.indexB = 0; cf.typeB = (byte) ContactID.Type.VERTEX; // Region A float dd; Vec2 P; if (v <= 0.0f) { P = A; d.set(Q); d.subLocal(P); dd = Vec2.dot(d, d); if (dd > radius*radius) { return; } // Is there an edge connected to A? if (edgeA.m_hasVertex0) { Vec2 A1 = edgeA.m_vertex0; Vec2 B1 = A; e1.set(B1); e1.subLocal(A1); temp.set(B1); temp.subLocal(Q); float u1 = Vec2.dot(e1, temp); // Is the circle in Region AB of the previous edge? if (u1 > 0.0f) { return; } } cf.indexA = 0; cf.typeA = (byte) ContactID.Type.VERTEX; manifold.pointCount = 1; manifold.type = ManifoldType.CIRCLES; manifold.localNormal.setZero(); manifold.localPoint.set(P); // manifold.points[0].id.key = 0; manifold.points[0].id.set(cf); manifold.points[0].localPoint.set(circleB.m_p); return; } // Region B if (u <= 0.0f) { P = B; d.set(Q); d.subLocal(P); dd = Vec2.dot(d, d); if (dd > radius*radius) { return; } // Is there an edge connected to B? if (edgeA.m_hasVertex3) { Vec2 B2 = edgeA.m_vertex3; Vec2 A2 = B; Vec2 e2 = e1; e2.set(B2); e2.subLocal(A2); temp.set(Q); temp.subLocal(A2); float v2 = Vec2.dot(e2, temp); // Is the circle in Region AB of the next edge? if (v2 > 0.0f) { return; } } cf.indexA = 1; cf.typeA = (byte) ContactID.Type.VERTEX; manifold.pointCount = 1; manifold.type = ManifoldType.CIRCLES; manifold.localNormal.setZero(); manifold.localPoint.set(P); // manifold.points[0].id.key = 0; manifold.points[0].id.set(cf); manifold.points[0].localPoint.set(circleB.m_p); return; } // Region AB float den = Vec2.dot(e, e); Debug.Assert(den > 0.0f); // Vec2 P = (1.0f / den) * (u * A + v * B); P = A; P.mulLocal(u); temp.set(B); temp.mulLocal(v); P.addLocal(temp); P.mulLocal(1.0f/den); d.set(Q); d.subLocal(P); dd = Vec2.dot(d, d); if (dd > radius*radius) { return; } n.x = -e.y; n.y = e.x; temp.set(Q); temp.subLocal(A); if (Vec2.dot(n, temp) < 0.0f) { n.set(-n.x, -n.y); } n.normalize(); cf.indexA = 0; cf.typeA = (byte) ContactID.Type.FACE; manifold.pointCount = 1; manifold.type = ManifoldType.FACE_A; manifold.localNormal.set(n); manifold.localPoint.set(A); // manifold.points[0].id.key = 0; manifold.points[0].id.set(cf); manifold.points[0].localPoint.set(circleB.m_p); }
// djm pooling, and from above /** * Compute the collision manifold between a polygon and a circle. * * @param manifold * @param polygon * @param xfA * @param circle * @param xfB */ public void collidePolygonAndCircle(Manifold manifold, PolygonShape polygon, Transform xfA, CircleShape circle, Transform xfB) { manifold.pointCount = 0; // Vec2 v = circle.m_p; // Compute circle position in the frame of the polygon. // before inline: // Transform.mulToOutUnsafe(xfB, circle.m_p, c); // Transform.mulTransToOut(xfA, c, cLocal); // float cLocalx = cLocal.x; // float cLocaly = cLocal.y; // after inline: Vec2 circlep = circle.m_p; Rot xfBq = xfB.q; Rot xfAq = xfA.q; float cx = (xfBq.c*circlep.x - xfBq.s*circlep.y) + xfB.p.x; float cy = (xfBq.s*circlep.x + xfBq.c*circlep.y) + xfB.p.y; float px = cx - xfA.p.x; float py = cy - xfA.p.y; float cLocalx = (xfAq.c*px + xfAq.s*py); float cLocaly = (-xfAq.s*px + xfAq.c*py); // end inline // Find the min separating edge. int normalIndex = 0; float separation = -float.MaxValue; float radius = polygon.m_radius + circle.m_radius; int vertexCount = polygon.m_count; float s; Vec2[] vertices = polygon.m_vertices; Vec2[] normals = polygon.m_normals; for (int i = 0; i < vertexCount; i++) { // before inline // temp.set(cLocal).subLocal(vertices[i]); // float s = Vec2.dot(normals[i], temp); // after inline Vec2 vertex = vertices[i]; float tempx = cLocalx - vertex.x; float tempy = cLocaly - vertex.y; s = normals[i].x*tempx + normals[i].y*tempy; if (s > radius) { // early ref return; } if (s > separation) { separation = s; normalIndex = i; } } // Vertices that subtend the incident face. int vertIndex1 = normalIndex; int vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0; Vec2 v1 = vertices[vertIndex1]; Vec2 v2 = vertices[vertIndex2]; // If the center is inside the polygon ... if (separation < Settings.EPSILON) { manifold.pointCount = 1; manifold.type = ManifoldType.FACE_A; // before inline: // manifold.localNormal.set(normals[normalIndex]); // manifold.localPoint.set(v1).addLocal(v2).mulLocal(.5f); // manifold.points[0].localPoint.set(circle.m_p); // after inline: Vec2 normal = normals[normalIndex]; manifold.localNormal.x = normal.x; manifold.localNormal.y = normal.y; manifold.localPoint.x = (v1.x + v2.x)*.5f; manifold.localPoint.y = (v1.y + v2.y)*.5f; ManifoldPoint mpoint = manifold.points[0]; mpoint.localPoint.x = circlep.x; mpoint.localPoint.y = circlep.y; mpoint.id.zero(); // end inline return; } // Compute barycentric coordinates // before inline: // temp.set(cLocal).subLocal(v1); // temp2.set(v2).subLocal(v1); // float u1 = Vec2.dot(temp, temp2); // temp.set(cLocal).subLocal(v2); // temp2.set(v1).subLocal(v2); // float u2 = Vec2.dot(temp, temp2); // after inline: float tempX = cLocalx - v1.x; float tempY = cLocaly - v1.y; float temp2X = v2.x - v1.x; float temp2Y = v2.y - v1.y; float u1 = tempX*temp2X + tempY*temp2Y; float temp3X = cLocalx - v2.x; float temp3Y = cLocaly - v2.y; float temp4X = v1.x - v2.x; float temp4Y = v1.y - v2.y; float u2 = temp3X*temp4X + temp3Y*temp4Y; // end inline if (u1 <= 0f) { // inlined float dx = cLocalx - v1.x; float dy = cLocaly - v1.y; if (dx*dx + dy*dy > radius*radius) { return; } manifold.pointCount = 1; manifold.type = ManifoldType.FACE_A; // before inline: // manifold.localNormal.set(cLocal).subLocal(v1); // after inline: manifold.localNormal.x = cLocalx - v1.x; manifold.localNormal.y = cLocaly - v1.y; // end inline manifold.localNormal.normalize(); manifold.localPoint.set(v1); manifold.points[0].localPoint.set(circlep); manifold.points[0].id.zero(); } else if (u2 <= 0.0f) { // inlined float dx = cLocalx - v2.x; float dy = cLocaly - v2.y; if (dx*dx + dy*dy > radius*radius) { return; } manifold.pointCount = 1; manifold.type = ManifoldType.FACE_A; // before inline: // manifold.localNormal.set(cLocal).subLocal(v2); // after inline: manifold.localNormal.x = cLocalx - v2.x; manifold.localNormal.y = cLocaly - v2.y; // end inline manifold.localNormal.normalize(); manifold.localPoint.set(v2); manifold.points[0].localPoint.set(circlep); manifold.points[0].id.zero(); } else { // Vec2 faceCenter = 0.5f * (v1 + v2); // (temp is faceCenter) // before inline: // temp.set(v1).addLocal(v2).mulLocal(.5f); // // temp2.set(cLocal).subLocal(temp); // separation = Vec2.dot(temp2, normals[vertIndex1]); // if (separation > radius) { // return; // } // after inline: float fcx = (v1.x + v2.x)*.5f; float fcy = (v1.y + v2.y)*.5f; float tx = cLocalx - fcx; float ty = cLocaly - fcy; Vec2 normal = normals[vertIndex1]; separation = tx*normal.x + ty*normal.y; if (separation > radius) { return; } // end inline manifold.pointCount = 1; manifold.type = ManifoldType.FACE_A; manifold.localNormal.set(normals[vertIndex1]); manifold.localPoint.x = fcx; // (faceCenter) manifold.localPoint.y = fcy; manifold.points[0].localPoint.set(circlep); manifold.points[0].id.zero(); } }
public override void initTest(bool deserialized) { if (deserialized) { return; } // Ground body { EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); FixtureDef sd = new FixtureDef(); sd.shape = shape; sd.friction = 0.3f; BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); ground.createFixture(sd); } // Small triangle Vec2[] vertices = new Vec2[3]; vertices[0] = new Vec2(-1.0f, 0.0f); vertices[1] = new Vec2(1.0f, 0.0f); vertices[2] = new Vec2(0.0f, 2.0f); PolygonShape polygon = new PolygonShape(); polygon.set(vertices, 3); FixtureDef triangleShapeDef = new FixtureDef(); triangleShapeDef.shape = polygon; triangleShapeDef.density = 1.0f; triangleShapeDef.filter.groupIndex = k_smallGroup; triangleShapeDef.filter.categoryBits = k_triangleCategory; triangleShapeDef.filter.maskBits = k_triangleMask; BodyDef triangleBodyDef = new BodyDef(); triangleBodyDef.type = BodyType.DYNAMIC; triangleBodyDef.position.set(-5.0f, 2.0f); Body body1 = getWorld().createBody(triangleBodyDef); body1.createFixture(triangleShapeDef); // Large triangle (recycle definitions) vertices[0].mulLocal(2.0f); vertices[1].mulLocal(2.0f); vertices[2].mulLocal(2.0f); polygon.set(vertices, 3); triangleShapeDef.filter.groupIndex = k_largeGroup; triangleBodyDef.position.set(-5.0f, 6.0f); triangleBodyDef.fixedRotation = true; // look at me! Body body2 = getWorld().createBody(triangleBodyDef); body2.createFixture(triangleShapeDef); { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(-5.0f, 10.0f); Body body = getWorld().createBody(bd); PolygonShape p = new PolygonShape(); p.setAsBox(0.5f, 1.0f); body.createFixture(p, 1.0f); PrismaticJointDef jd = new PrismaticJointDef(); jd.bodyA = body2; jd.bodyB = body; jd.enableLimit = true; jd.localAnchorA.set(0.0f, 4.0f); jd.localAnchorB.setZero(); jd.localAxisA.set(0.0f, 1.0f); jd.lowerTranslation = -1.0f; jd.upperTranslation = 1.0f; getWorld().createJoint(jd); } // Small box polygon.setAsBox(1.0f, 0.5f); FixtureDef boxShapeDef = new FixtureDef(); boxShapeDef.shape = polygon; boxShapeDef.density = 1.0f; boxShapeDef.restitution = 0.1f; boxShapeDef.filter.groupIndex = k_smallGroup; boxShapeDef.filter.categoryBits = k_boxCategory; boxShapeDef.filter.maskBits = k_boxMask; BodyDef boxBodyDef = new BodyDef(); boxBodyDef.type = BodyType.DYNAMIC; boxBodyDef.position.set(0.0f, 2.0f); Body body3 = getWorld().createBody(boxBodyDef); body3.createFixture(boxShapeDef); // Large box (recycle definitions) polygon.setAsBox(2.0f, 1.0f); boxShapeDef.filter.groupIndex = k_largeGroup; boxBodyDef.position.set(0.0f, 6.0f); Body body4 = getWorld().createBody(boxBodyDef); body4.createFixture(boxShapeDef); // Small circle CircleShape circle = new CircleShape(); circle.m_radius = 1.0f; FixtureDef circleShapeDef = new FixtureDef(); circleShapeDef.shape = circle; circleShapeDef.density = 1.0f; circleShapeDef.filter.groupIndex = k_smallGroup; circleShapeDef.filter.categoryBits = k_circleCategory; circleShapeDef.filter.maskBits = k_circleMask; BodyDef circleBodyDef = new BodyDef(); circleBodyDef.type = BodyType.DYNAMIC; circleBodyDef.position.set(5.0f, 2.0f); Body body5 = getWorld().createBody(circleBodyDef); body5.createFixture(circleShapeDef); // Large circle circle.m_radius *= 2.0f; circleShapeDef.filter.groupIndex = k_largeGroup; circleBodyDef.position.set(5.0f, 6.0f); Body body6 = getWorld().createBody(circleBodyDef); body6.createFixture(circleShapeDef); }
public override void initTest(bool argDeserialized) { for (int i = 0; i < m_bodies.Length; i++) { m_bodies[i] = null; } // Ground body { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); float x1 = -20.0f; float y1 = 2.0f*MathUtils.cos(x1/10.0f*MathUtils.PI); for (int i = 0; i < 80; ++i) { float x2 = x1 + 0.5f; float y2 = 2.0f*MathUtils.cos(x2/10.0f*MathUtils.PI); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(x1, y1), new Vec2(x2, y2)); ground.createFixture(shape, 0.0f); x1 = x2; y1 = y2; } } { Vec2[] vertices = new Vec2[3]; vertices[0] = new Vec2(-0.5f, 0.0f); vertices[1] = new Vec2(0.5f, 0.0f); vertices[2] = new Vec2(0.0f, 1.5f); m_polygons[0] = new PolygonShape(); m_polygons[0].set(vertices, 3); } { Vec2[] vertices = new Vec2[3]; vertices[0] = new Vec2(-0.1f, 0.0f); vertices[1] = new Vec2(0.1f, 0.0f); vertices[2] = new Vec2(0.0f, 1.5f); m_polygons[1] = new PolygonShape(); m_polygons[1].set(vertices, 3); } { float w = 1.0f; float b = w/(2.0f + MathUtils.sqrt(2.0f)); float s = MathUtils.sqrt(2.0f)*b; Vec2[] vertices = new Vec2[8]; vertices[0] = new Vec2(0.5f*s, 0.0f); vertices[1] = new Vec2(0.5f*w, b); vertices[2] = new Vec2(0.5f*w, b + s); vertices[3] = new Vec2(0.5f*s, w); vertices[4] = new Vec2(-0.5f*s, w); vertices[5] = new Vec2(-0.5f*w, b + s); vertices[6] = new Vec2(-0.5f*w, b); vertices[7] = new Vec2(-0.5f*s, 0.0f); m_polygons[2] = new PolygonShape(); m_polygons[2].set(vertices, 8); } { m_polygons[3] = new PolygonShape(); m_polygons[3].setAsBox(0.5f, 0.5f); } { m_circle = new CircleShape(); m_circle.m_radius = 0.5f; } m_bodyIndex = 0; m_angle = 0.0f; }
public override void initTest(bool deserialized) { if (deserialized) { return; } { BodyDef bd = new BodyDef(); bd.position.set(0.0f, 0.0f); Body body = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(50.0f, 0.0f), new Vec2(-50.0f, 0.0f)); body.createFixture(shape, 0.0f); } { CircleShape circle1 = new CircleShape(); circle1.m_radius = 0.5f; circle1.m_p.set(-0.5f, 0.5f); CircleShape circle2 = new CircleShape(); ; circle2.m_radius = 0.5f; circle2.m_p.set(0.5f, 0.5f); for (int i = 0; i < 10; ++i) { float x = MathUtils.randomFloat(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(x + 5.0f, 1.05f + 2.5f*i); bd.angle = MathUtils.randomFloat(-MathUtils.PI, MathUtils.PI); Body body = getWorld().createBody(bd); body.createFixture(circle1, 2.0f); body.createFixture(circle2, 0.0f); } } { PolygonShape polygon1 = new PolygonShape(); polygon1.setAsBox(0.25f, 0.5f); PolygonShape polygon2 = new PolygonShape(); polygon2.setAsBox(0.25f, 0.5f, new Vec2(0.0f, -0.5f), 0.5f*MathUtils.PI); for (int i = 0; i < 10; ++i) { float x = MathUtils.randomFloat(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(x - 5.0f, 1.05f + 2.5f*i); bd.angle = MathUtils.randomFloat(-MathUtils.PI, MathUtils.PI); Body body = getWorld().createBody(bd); body.createFixture(polygon1, 2.0f); body.createFixture(polygon2, 2.0f); } } { Transform xf1 = new Transform(); xf1.q.set(0.3524f*MathUtils.PI); Rot.mulToOut(xf1.q, new Vec2(1.0f, 0.0f), ref xf1.p); Vec2[] vertices = new Vec2[3]; PolygonShape triangle1 = new PolygonShape(); vertices[0] = Transform.mul(xf1, new Vec2(-1.0f, 0.0f)); vertices[1] = Transform.mul(xf1, new Vec2(1.0f, 0.0f)); vertices[2] = Transform.mul(xf1, new Vec2(0.0f, 0.5f)); triangle1.set(vertices, 3); Transform xf2 = new Transform(); xf2.q.set(-0.3524f*MathUtils.PI); Rot.mulToOut(xf2.q, new Vec2(-1.0f, 0.0f), ref xf2.p); PolygonShape triangle2 = new PolygonShape(); vertices[0] = Transform.mul(xf2, new Vec2(-1.0f, 0.0f)); vertices[1] = Transform.mul(xf2, new Vec2(1.0f, 0.0f)); vertices[2] = Transform.mul(xf2, new Vec2(0.0f, 0.5f)); triangle2.set(vertices, 3); for (int i = 0; i < 10; ++i) { float x = MathUtils.randomFloat(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(x, 2.05f + 2.5f*i); bd.angle = 0.0f; Body body = getWorld().createBody(bd); body.createFixture(triangle1, 2.0f); body.createFixture(triangle2, 2.0f); } } { PolygonShape bottom = new PolygonShape(); bottom.setAsBox(1.5f, 0.15f); PolygonShape left = new PolygonShape(); left.setAsBox(0.15f, 2.7f, new Vec2(-1.45f, 2.35f), 0.2f); PolygonShape right = new PolygonShape(); right.setAsBox(0.15f, 2.7f, new Vec2(1.45f, 2.35f), -0.2f); BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(0.0f, 2.0f); Body body = getWorld().createBody(bd); body.createFixture(bottom, 4.0f); body.createFixture(left, 4.0f); body.createFixture(right, 4.0f); } }
/** * Compute the collision manifold between two circles. * * @param manifold * @param circle1 * @param xfA * @param circle2 * @param xfB */ public void collideCircles(Manifold manifold, CircleShape circle1, Transform xfA, CircleShape circle2, Transform xfB) { manifold.pointCount = 0; // before inline: // Transform.mulToOut(xfA, circle1.m_p, pA); // Transform.mulToOut(xfB, circle2.m_p, pB); // d.set(pB).subLocal(pA); // float distSqr = d.x * d.x + d.y * d.y; // after inline: Vec2 circle1p = circle1.m_p; Vec2 circle2p = circle2.m_p; float pAx = (xfA.q.c*circle1p.x - xfA.q.s*circle1p.y) + xfA.p.x; float pAy = (xfA.q.s*circle1p.x + xfA.q.c*circle1p.y) + xfA.p.y; float pBx = (xfB.q.c*circle2p.x - xfB.q.s*circle2p.y) + xfB.p.x; float pBy = (xfB.q.s*circle2p.x + xfB.q.c*circle2p.y) + xfB.p.y; float dx = pBx - pAx; float dy = pBy - pAy; float distSqr = dx*dx + dy*dy; // end inline float radius = circle1.m_radius + circle2.m_radius; if (distSqr > radius*radius) { return; } manifold.type = ManifoldType.CIRCLES; manifold.localPoint.set(circle1p); manifold.localNormal.setZero(); manifold.pointCount = 1; manifold.points[0].localPoint.set(circle2p); manifold.points[0].id.zero(); }
public override void initTest(bool deserialized) { if (deserialized) { return; } // Ground body { EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-50.0f, 0.0f), new Vec2(50.0f, 0.0f)); FixtureDef sd = new FixtureDef(); sd.shape = shape; BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); ground.createFixture(sd); } float xLo = -5.0f, xHi = 5.0f; float yLo = 2.0f, yHi = 35.0f; // Small triangle Vec2[] vertices = new Vec2[3]; vertices[0] = new Vec2(-1.0f, 0.0f); vertices[1] = new Vec2(1.0f, 0.0f); vertices[2] = new Vec2(0.0f, 2.0f); PolygonShape polygon = new PolygonShape(); polygon.set(vertices, 3); FixtureDef triangleShapeDef = new FixtureDef(); triangleShapeDef.shape = polygon; triangleShapeDef.density = 1.0f; BodyDef triangleBodyDef = new BodyDef(); triangleBodyDef.type = BodyType.DYNAMIC; triangleBodyDef.position.set(MathUtils.randomFloat(xLo, xHi), MathUtils.randomFloat(yLo, yHi)); Body body1 = getWorld().createBody(triangleBodyDef); body1.createFixture(triangleShapeDef); // Large triangle (recycle definitions) vertices[0].mulLocal(2.0f); vertices[1].mulLocal(2.0f); vertices[2].mulLocal(2.0f); polygon.set(vertices, 3); triangleBodyDef.position.set(MathUtils.randomFloat(xLo, xHi), MathUtils.randomFloat(yLo, yHi)); Body body2 = getWorld().createBody(triangleBodyDef); body2.createFixture(triangleShapeDef); // Small box polygon.setAsBox(1.0f, 0.5f); FixtureDef boxShapeDef = new FixtureDef(); boxShapeDef.shape = polygon; boxShapeDef.density = 1.0f; BodyDef boxBodyDef = new BodyDef(); boxBodyDef.type = BodyType.DYNAMIC; boxBodyDef.position.set(MathUtils.randomFloat(xLo, xHi), MathUtils.randomFloat(yLo, yHi)); Body body3 = getWorld().createBody(boxBodyDef); body3.createFixture(boxShapeDef); // Large box (recycle definitions) polygon.setAsBox(2.0f, 1.0f); boxBodyDef.position.set(MathUtils.randomFloat(xLo, xHi), MathUtils.randomFloat(yLo, yHi)); Body body4 = getWorld().createBody(boxBodyDef); body4.createFixture(boxShapeDef); // Small circle CircleShape circle = new CircleShape(); circle.m_radius = 1.0f; FixtureDef circleShapeDef = new FixtureDef(); circleShapeDef.shape = circle; circleShapeDef.density = 1.0f; BodyDef circleBodyDef = new BodyDef(); circleBodyDef.type = BodyType.DYNAMIC; circleBodyDef.position.set(MathUtils.randomFloat(xLo, xHi), MathUtils.randomFloat(yLo, yHi)); Body body5 = getWorld().createBody(circleBodyDef); body5.createFixture(circleShapeDef); // Large circle circle.m_radius *= 2.0f; circleBodyDef.position.set(MathUtils.randomFloat(xLo, xHi), MathUtils.randomFloat(yLo, yHi)); Body body6 = getWorld().createBody(circleBodyDef); body6.createFixture(circleShapeDef); }
public override void initTest(bool argDeserialized) { // Ground body { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.createFixture(shape, 0.0f); } { Vec2[] vertices = new Vec2[3]; vertices[0] = new Vec2(-0.5f, 0.0f); vertices[1] = new Vec2(0.5f, 0.0f); vertices[2] = new Vec2(0.0f, 1.5f); m_polygons[0] = new PolygonShape(); m_polygons[0].set(vertices, 3); } { Vec2[] vertices = new Vec2[3]; vertices[0] = new Vec2(-0.1f, 0.0f); vertices[1] = new Vec2(0.1f, 0.0f); vertices[2] = new Vec2(0.0f, 1.5f); m_polygons[1] = new PolygonShape(); m_polygons[1].set(vertices, 3); } { float w = 1.0f; float b = w/(2.0f + MathUtils.sqrt(2.0f)); float s = MathUtils.sqrt(2.0f)*b; Vec2[] vertices = new Vec2[8]; vertices[0] = new Vec2(0.5f*s, 0.0f); vertices[1] = new Vec2(0.5f*w, b); vertices[2] = new Vec2(0.5f*w, b + s); vertices[3] = new Vec2(0.5f*s, w); vertices[4] = new Vec2(-0.5f*s, w); vertices[5] = new Vec2(-0.5f*w, b + s); vertices[6] = new Vec2(-0.5f*w, b); vertices[7] = new Vec2(-0.5f*s, 0.0f); m_polygons[2] = new PolygonShape(); m_polygons[2].set(vertices, 8); } { m_polygons[3] = new PolygonShape(); m_polygons[3].setAsBox(0.5f, 0.5f); } { m_circle = new CircleShape(); m_circle.m_radius = 0.5f; } m_bodyIndex = 0; }
public override void initTest(bool argDeserialized) { if (argDeserialized) { return; } Body ground = null; { BodyDef bd = new BodyDef(); ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.createFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.setAsBox(0.5f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; WeldJointDef jd = new WeldJointDef(); Body prevBody = ground; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(-14.5f + 1.0f*i, 5.0f); Body body = getWorld().createBody(bd); body.createFixture(fd); Vec2 anchor = new Vec2(-15.0f + 1.0f*i, 5.0f); jd.initialize(prevBody, body, anchor); getWorld().createJoint(jd); prevBody = body; } } { PolygonShape shape = new PolygonShape(); shape.setAsBox(1f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; WeldJointDef jd = new WeldJointDef(); jd.frequencyHz = 5f; jd.dampingRatio = .7f; Body prevBody = ground; for (int i = 0; i < 3; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(-14.0f + 2.0f*i, 15.0f); Body body = getWorld().createBody(bd); body.createFixture(fd); Vec2 anchor = new Vec2(-15.0f + 2.0f*i, 15.0f); jd.initialize(prevBody, body, anchor); getWorld().createJoint(jd); prevBody = body; } } { PolygonShape shape = new PolygonShape(); shape.setAsBox(0.5f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; WeldJointDef jd = new WeldJointDef(); Body prevBody = ground; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(-4.5f + 1.0f*i, 5.0f); Body body = getWorld().createBody(bd); body.createFixture(fd); if (i > 0) { Vec2 anchor = new Vec2(-5.0f + 1.0f*i, 5.0f); jd.initialize(prevBody, body, anchor); getWorld().createJoint(jd); } prevBody = body; } } { PolygonShape shape = new PolygonShape(); shape.setAsBox(0.5f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; WeldJointDef jd = new WeldJointDef(); jd.frequencyHz = 8f; jd.dampingRatio = .7f; Body prevBody = ground; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(5.5f + 1.0f*i, 10.0f); Body body = getWorld().createBody(bd); body.createFixture(fd); if (i > 0) { Vec2 anchor = new Vec2(5.0f + 1.0f*i, 10.0f); jd.initialize(prevBody, body, anchor); getWorld().createJoint(jd); } prevBody = body; } } for (int i = 0; i < 2; ++i) { Vec2[] vertices = new Vec2[3]; vertices[0] = new Vec2(-0.5f, 0.0f); vertices[1] = new Vec2(0.5f, 0.0f); vertices[2] = new Vec2(0.0f, 1.5f); PolygonShape shape = new PolygonShape(); shape.set(vertices, 3); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 1.0f; BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(-8.0f + 8.0f*i, 12.0f); Body body = getWorld().createBody(bd); body.createFixture(fd); } for (int i = 0; i < 2; ++i) { CircleShape shape = new CircleShape(); shape.m_radius = 0.5f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 1.0f; BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(-6.0f + 6.0f*i, 10.0f); Body body = getWorld().createBody(bd); body.createFixture(fd); } }
public override void initTest(bool deserialized) { if (deserialized) { return; } m_hz = 4.0f; m_zeta = 0.7f; m_speed = 50.0f; Body ground = null; { BodyDef bd = new BodyDef(); ground = m_world.createBody(bd); EdgeShape shape = new EdgeShape(); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 0.0f; fd.friction = 0.6f; shape.set(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f)); ground.createFixture(fd); float[] hs = {0.25f, 1.0f, 4.0f, 0.0f, 0.0f, -1.0f, -2.0f, -2.0f, -1.25f, 0.0f}; float x = 20.0f, y1 = 0.0f, dx = 5.0f; for (int i = 0; i < 10; ++i) { float y2 = hs[i]; shape.set(new Vec2(x, y1), new Vec2(x + dx, y2)); ground.createFixture(fd); y1 = y2; x += dx; } for (int i = 0; i < 10; ++i) { float y2 = hs[i]; shape.set(new Vec2(x, y1), new Vec2(x + dx, y2)); ground.createFixture(fd); y1 = y2; x += dx; } shape.set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f)); ground.createFixture(fd); x += 80.0f; shape.set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f)); ground.createFixture(fd); x += 40.0f; shape.set(new Vec2(x, 0.0f), new Vec2(x + 10.0f, 5.0f)); ground.createFixture(fd); x += 20.0f; shape.set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f)); ground.createFixture(fd); x += 40.0f; shape.set(new Vec2(x, 0.0f), new Vec2(x, 20.0f)); ground.createFixture(fd); } // Teeter { BodyDef bd = new BodyDef(); bd.position.set(140.0f, 1.0f); bd.type = BodyType.DYNAMIC; Body body = m_world.createBody(bd); PolygonShape box = new PolygonShape(); box.setAsBox(10.0f, 0.25f); body.createFixture(box, 1.0f); RevoluteJointDef jd = new RevoluteJointDef(); jd.initialize(ground, body, body.getPosition()); jd.lowerAngle = -8.0f*MathUtils.PI/180.0f; jd.upperAngle = 8.0f*MathUtils.PI/180.0f; jd.enableLimit = true; m_world.createJoint(jd); body.applyAngularImpulse(100.0f); } // Bridge { int N = 20; PolygonShape shape = new PolygonShape(); shape.setAsBox(1.0f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 1.0f; fd.friction = 0.6f; RevoluteJointDef jd = new RevoluteJointDef(); Body prevBody = ground; for (int i = 0; i < N; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(161.0f + 2.0f*i, -0.125f); Body body = m_world.createBody(bd); body.createFixture(fd); Vec2 anchor = new Vec2(160.0f + 2.0f*i, -0.125f); jd.initialize(prevBody, body, anchor); m_world.createJoint(jd); prevBody = body; } Vec2 anchor2 = new Vec2(160.0f + 2.0f*N, -0.125f); jd.initialize(prevBody, ground, anchor2); m_world.createJoint(jd); } // Boxes { PolygonShape box = new PolygonShape(); box.setAsBox(0.5f, 0.5f); Body body = null; BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(230.0f, 0.5f); body = m_world.createBody(bd); body.createFixture(box, 0.5f); bd.position.set(230.0f, 1.5f); body = m_world.createBody(bd); body.createFixture(box, 0.5f); bd.position.set(230.0f, 2.5f); body = m_world.createBody(bd); body.createFixture(box, 0.5f); bd.position.set(230.0f, 3.5f); body = m_world.createBody(bd); body.createFixture(box, 0.5f); bd.position.set(230.0f, 4.5f); body = m_world.createBody(bd); body.createFixture(box, 0.5f); } // Car { PolygonShape chassis = new PolygonShape(); Vec2[] vertices = new Vec2[8]; vertices[0] = new Vec2(-1.5f, -0.5f); vertices[1] = new Vec2(1.5f, -0.5f); vertices[2] = new Vec2(1.5f, 0.0f); vertices[3] = new Vec2(0.0f, 0.9f); vertices[4] = new Vec2(-1.15f, 0.9f); vertices[5] = new Vec2(-1.5f, 0.2f); chassis.set(vertices, 6); CircleShape circle = new CircleShape(); circle.m_radius = 0.4f; BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(0.0f, 1.0f); m_car = m_world.createBody(bd); m_car.createFixture(chassis, 1.0f); FixtureDef fd = new FixtureDef(); fd.shape = circle; fd.density = 1.0f; fd.friction = 0.9f; bd.position.set(-1.0f, 0.35f); m_wheel1 = m_world.createBody(bd); m_wheel1.createFixture(fd); bd.position.set(1.0f, 0.4f); m_wheel2 = m_world.createBody(bd); m_wheel2.createFixture(fd); WheelJointDef jd = new WheelJointDef(); Vec2 axis = new Vec2(0.0f, 1.0f); jd.initialize(m_car, m_wheel1, m_wheel1.getPosition(), axis); jd.motorSpeed = 0.0f; jd.maxMotorTorque = 20.0f; jd.enableMotor = true; jd.frequencyHz = m_hz; jd.dampingRatio = m_zeta; m_spring1 = (WheelJoint) m_world.createJoint(jd); jd.initialize(m_car, m_wheel2, m_wheel2.getPosition(), axis); jd.motorSpeed = 0.0f; jd.maxMotorTorque = 10.0f; jd.enableMotor = false; jd.frequencyHz = m_hz; jd.dampingRatio = m_zeta; m_spring2 = (WheelJoint) m_world.createJoint(jd); } }
public override void initTest(bool argDeserialized) { if (argDeserialized) { return; } Body leftWall = null; Body rightWall = null; { // Ground PolygonShape sd = new PolygonShape(); sd.setAsBox(50.0f, 10.0f); BodyDef bd = new BodyDef(); bd.type = BodyType.STATIC; bd.position = new Vec2(0.0f, -10.0f); Body b = getWorld().createBody(bd); FixtureDef fd = new FixtureDef(); fd.shape = sd; fd.friction = 1.0f; b.createFixture(fd); // Walls sd.setAsBox(3.0f, 50.0f); bd = new BodyDef(); bd.position = new Vec2(45.0f, 25.0f); rightWall = getWorld().createBody(bd); rightWall.createFixture(sd, 0); bd.position = new Vec2(-45.0f, 25.0f); leftWall = getWorld().createBody(bd); leftWall.createFixture(sd, 0); // Corners bd = new BodyDef(); sd.setAsBox(20.0f, 3.0f); bd.angle = (float) (-System.Math.PI/4.0); bd.position = new Vec2(-35f, 8.0f); Body myBod = getWorld().createBody(bd); myBod.createFixture(sd, 0); bd.angle = (float) (System.Math.PI/4.0); bd.position = new Vec2(35f, 8.0f); myBod = getWorld().createBody(bd); myBod.createFixture(sd, 0); // top sd.setAsBox(50.0f, 10.0f); bd.type = BodyType.STATIC; bd.angle = 0; bd.position = new Vec2(0.0f, 75.0f); b = getWorld().createBody(bd); fd.shape = sd; fd.friction = 1.0f; b.createFixture(fd); } CircleShape cd; FixtureDef fd2 = new FixtureDef(); BodyDef bd2 = new BodyDef(); bd2.type = BodyType.DYNAMIC; int numPieces = 5; float radius = 6f; bd2.position = new Vec2(0.0f, 10.0f); Body body = getWorld().createBody(bd2); for (int i = 0; i < numPieces; i++) { cd = new CircleShape(); cd.m_radius = 1.2f; fd2.shape = cd; fd2.density = 25; fd2.friction = .1f; fd2.restitution = .9f; float xPos = radius*(float) System.Math.Cos(2f*System.Math.PI*(i/(float) (numPieces))); float yPos = radius*(float) System.Math.Sin(2f*System.Math.PI*(i/(float) (numPieces))); cd.m_p.set(xPos, yPos); body.createFixture(fd2); } body.setBullet(false); RevoluteJointDef rjd = new RevoluteJointDef(); rjd.initialize(body, getGroundBody(), body.getPosition()); rjd.motorSpeed = MathUtils.PI; rjd.maxMotorTorque = 1000000.0f; rjd.enableMotor = true; joint = (RevoluteJoint) getWorld().createJoint(rjd); { int loadSize = 41; for (int j = 0; j < 15; j++) { for (int i = 0; i < loadSize; i++) { CircleShape circ = new CircleShape(); BodyDef bod = new BodyDef(); bod.type = BodyType.DYNAMIC; circ.m_radius = 1.0f + (i%2 == 0 ? 1.0f : -1.0f)*.5f*MathUtils.randomFloat(.5f, 1f); FixtureDef fd3 = new FixtureDef(); fd3.shape = circ; fd3.density = circ.m_radius*1.5f; fd3.friction = 0.5f; fd3.restitution = 0.7f; float xPos = -39f + 2*i; float yPos = 50f + j; bod.position = new Vec2(xPos, yPos); Body myBody = getWorld().createBody(bod); myBody.createFixture(fd3); } } } getWorld().setGravity(new Vec2(0, -50)); }
public override void initTest(bool deserialized) { //m_state = State.e_unknown; if (deserialized) { return; } // Ground { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f)); ground.createFixture(shape, 0.0f); } // Platform { BodyDef bd = new BodyDef(); bd.position.set(0.0f, 10.0f); Body body = getWorld().createBody(bd); PolygonShape shape = new PolygonShape(); shape.setAsBox(3.0f, 0.5f); m_platform = body.createFixture(shape, 0.0f); //m_bottom = 10.0f - 0.5f; m_top = 10.0f + 0.5f; } // Actor { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(0.0f, 12.0f); Body body = getWorld().createBody(bd); m_radius = 0.5f; CircleShape shape = new CircleShape(); shape.m_radius = m_radius; m_character = body.createFixture(shape, 20.0f); body.setLinearVelocity(new Vec2(0.0f, -50.0f)); //m_state = State.e_unknown; } }
public override void initTest(bool deserialized) { if (deserialized) { return; } // Ground body { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f)); ground.createFixture(shape, 0.0f); } // Collinear edges // This shows the problematic case where a box shape can hit // an internal vertex. { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.m_radius = 0.0f; shape.set(new Vec2(-8.0f, 1.0f), new Vec2(-6.0f, 1.0f)); ground.createFixture(shape, 0.0f); shape.set(new Vec2(-6.0f, 1.0f), new Vec2(-4.0f, 1.0f)); ground.createFixture(shape, 0.0f); shape.set(new Vec2(-4.0f, 1.0f), new Vec2(-2.0f, 1.0f)); ground.createFixture(shape, 0.0f); } // Chain shape { BodyDef bd = new BodyDef(); bd.angle = 0.25f*MathUtils.PI; Body ground = getWorld().createBody(bd); Vec2[] vs = new Vec2[4]; vs[0] = new Vec2(5.0f, 7.0f); vs[1] = new Vec2(6.0f, 8.0f); vs[2] = new Vec2(7.0f, 8.0f); vs[3] = new Vec2(8.0f, 7.0f); ChainShape shape = new ChainShape(); shape.createChain(vs, 4); ground.createFixture(shape, 0.0f); } // Square tiles. This shows that adjacency shapes may // have non-smooth collision. There is no solution // to this problem. { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); PolygonShape shape = new PolygonShape(); shape.setAsBox(1.0f, 1.0f, new Vec2(4.0f, 3.0f), 0.0f); ground.createFixture(shape, 0.0f); shape.setAsBox(1.0f, 1.0f, new Vec2(6.0f, 3.0f), 0.0f); ground.createFixture(shape, 0.0f); shape.setAsBox(1.0f, 1.0f, new Vec2(8.0f, 3.0f), 0.0f); ground.createFixture(shape, 0.0f); } // Square made from an edge loop. Collision should be smooth. { BodyDef bd = new BodyDef(); Body ground = m_world.createBody(bd); Vec2[] vs = new Vec2[4]; vs[0] = new Vec2(-1.0f, 3.0f); vs[1] = new Vec2(1.0f, 3.0f); vs[2] = new Vec2(1.0f, 5.0f); vs[3] = new Vec2(-1.0f, 5.0f); ChainShape shape = new ChainShape(); shape.createLoop(vs, 4); ground.createFixture(shape, 0.0f); } // Edge loop. Collision should be smooth. { BodyDef bd = new BodyDef(); bd.position.set(-10.0f, 4.0f); Body ground = getWorld().createBody(bd); Vec2[] vs = new Vec2[10]; vs[0] = new Vec2(0.0f, 0.0f); vs[1] = new Vec2(6.0f, 0.0f); vs[2] = new Vec2(6.0f, 2.0f); vs[3] = new Vec2(4.0f, 1.0f); vs[4] = new Vec2(2.0f, 2.0f); vs[5] = new Vec2(0.0f, 2.0f); vs[6] = new Vec2(-2.0f, 2.0f); vs[7] = new Vec2(-4.0f, 3.0f); vs[8] = new Vec2(-6.0f, 2.0f); vs[9] = new Vec2(-6.0f, 0.0f); ChainShape shape = new ChainShape(); shape.createLoop(vs, 10); ground.createFixture(shape, 0.0f); } // Square character 1 { BodyDef bd = new BodyDef(); bd.position.set(-3.0f, 8.0f); bd.type = BodyType.DYNAMIC; bd.fixedRotation = true; bd.allowSleep = false; Body body = getWorld().createBody(bd); PolygonShape shape = new PolygonShape(); shape.setAsBox(0.5f, 0.5f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; body.createFixture(fd); } // Square character 2 { BodyDef bd = new BodyDef(); bd.position.set(-5.0f, 5.0f); bd.type = BodyType.DYNAMIC; bd.fixedRotation = true; bd.allowSleep = false; Body body = getWorld().createBody(bd); PolygonShape shape = new PolygonShape(); shape.setAsBox(0.25f, 0.25f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; body.createFixture(fd); } // Hexagon character { BodyDef bd = new BodyDef(); bd.position.set(-5.0f, 8.0f); bd.type = BodyType.DYNAMIC; bd.fixedRotation = true; bd.allowSleep = false; Body body = getWorld().createBody(bd); float angle = 0.0f; float delta = MathUtils.PI/3.0f; Vec2[] vertices = new Vec2[6]; for (int i = 0; i < 6; ++i) { vertices[i] = new Vec2(0.5f*MathUtils.cos(angle), 0.5f*MathUtils.sin(angle)); angle += delta; } PolygonShape shape = new PolygonShape(); shape.set(vertices, 6); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; body.createFixture(fd); } // Circle character { BodyDef bd = new BodyDef(); bd.position.set(3.0f, 5.0f); bd.type = BodyType.DYNAMIC; bd.fixedRotation = true; bd.allowSleep = false; Body body = getWorld().createBody(bd); CircleShape shape = new CircleShape(); shape.m_radius = 0.5f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; body.createFixture(fd); } // Circle character { BodyDef bd = new BodyDef(); bd.position.set(-7.0f, 6.0f); bd.type = BodyType.DYNAMIC; bd.allowSleep = false; m_character = getWorld().createBody(bd); CircleShape shape = new CircleShape(); shape.m_radius = 0.25f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.friction = 1; m_character.createFixture(fd); } }
private void launchBomb(Vec2 position, Vec2 velocity) { if (bomb != null) { m_world.destroyBody(bomb); bomb = null; } // todo optimize this BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(position); bd.bullet = true; bomb = m_world.createBody(bd); bomb.setLinearVelocity(velocity); CircleShape circle = new CircleShape(); circle.m_radius = 0.3f; FixtureDef fd = new FixtureDef(); fd.shape = circle; fd.density = 20f; fd.restitution = 0; Vec2 minV = new Vec2(position); Vec2 maxV = new Vec2(position); minV.subLocal(new Vec2(.3f, .3f)); maxV.addLocal(new Vec2(.3f, .3f)); aabb.lowerBound.set(minV); aabb.upperBound.set(maxV); bomb.createFixture(fd); }
public override void initTest(bool argDeserialized) { if (argDeserialized) { return; } { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); // Floor shape.set(new Vec2(-10.0f, 0.0f), new Vec2(10.0f, 0.0f)); ground.createFixture(shape, 0.0f); // Left wall shape.set(new Vec2(-10.0f, 0.0f), new Vec2(-10.0f, 20.0f)); ground.createFixture(shape, 0.0f); // Right wall shape.set(new Vec2(10.0f, 0.0f), new Vec2(10.0f, 20.0f)); ground.createFixture(shape, 0.0f); // Roof shape.set(new Vec2(-10.0f, 20.0f), new Vec2(10.0f, 20.0f)); ground.createFixture(shape, 0.0f); } float radius = 0.5f; CircleShape shape2 = new CircleShape(); shape2.m_p.setZero(); shape2.m_radius = radius; FixtureDef fd = new FixtureDef(); fd.shape = shape2; fd.density = 1.0f; fd.friction = 0.1f; for (int j = 0; j < e_columnCount; ++j) { for (int i = 0; i < e_rowCount; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(-10.0f + (2.1f*j + 1.0f + 0.01f*i)*radius, (2.0f*i + 1.0f)*radius); Body body = getWorld().createBody(bd); body.createFixture(fd); } } getWorld().setGravity(new Vec2(0.0f, 0.0f)); }
public override void initTest(bool argDeserialized) { { BodyDef bd = new BodyDef(); bd.position.set(0.0f, 0.0f); Body body = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-10.0f, 0.0f), new Vec2(10.0f, 0.0f)); body.createFixture(shape, 0.0f); PolygonShape pshape = new PolygonShape(); pshape.setAsBox(0.2f, 1.0f, new Vec2(0.5f, 1.0f), 0.0f); body.createFixture(pshape, 0.0f); } m_poly = new PolygonShape(); m_poly.setAsBox(2.0f, 0.1f); m_circle = new CircleShape(); m_circle.m_p.setZero(); m_circle.m_radius = 0.5f; BodyDef bd2 = new BodyDef(); bd2.type = BodyType.DYNAMIC; bd2.position.set(0.0f, 20.0f); m_body = getWorld().createBody(bd2); currFixture = m_body.createFixture(m_poly, 1.0f); m_angularVelocity = (float) _random.NextDouble()*100 - 50; m_angularVelocity = 33.468121f; m_body.setLinearVelocity(new Vec2(0.0f, -100.0f)); m_body.setAngularVelocity(m_angularVelocity); TimeOfImpact.toiCalls = 0; TimeOfImpact.toiIters = 0; TimeOfImpact.toiMaxIters = 0; TimeOfImpact.toiRootIters = 0; TimeOfImpact.toiMaxRootIters = 0; }
public override void initTest(bool deserialized) { for (int i = 0; i < m_touching.Length; i++) { m_touching[i] = new BoolWrapper(); } { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); { EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.createFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); shape.m_radius = 5.0f; shape.m_p.set(0.0f, 10.0f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd._isSensor = true; m_sensor = ground.createFixture(fd); } } { CircleShape shape = new CircleShape(); shape.m_radius = 1.0f; for (int i = 0; i < _e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(-10.0f + 3.0f*i, 20.0f); bd.userData = m_touching[i]; m_touching[i].tf = false; m_bodies[i] = getWorld().createBody(bd); m_bodies[i].createFixture(shape, 1.0f); } } }
public override void initTest(bool deserialized) { if (deserialized) { return; } Body ground = null; { BodyDef bd = new BodyDef(); ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.createFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); shape.m_radius = 0.5f; BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; RevoluteJointDef rjd = new RevoluteJointDef(); bd.position.set(-10f, 20.0f); Body body = getWorld().createBody(bd); body.createFixture(shape, 5.0f); float w = 100.0f; body.setAngularVelocity(w); body.setLinearVelocity(new Vec2(-8.0f*w, 0.0f)); rjd.initialize(ground, body, new Vec2(-10.0f, 12.0f)); rjd.motorSpeed = -1.0f*MathUtils.PI; rjd.maxMotorTorque = 10000.0f; rjd.enableMotor = false; rjd.lowerAngle = -0.25f*MathUtils.PI; rjd.upperAngle = 0.5f*MathUtils.PI; rjd.enableLimit = true; rjd.collideConnected = true; m_joint = (RevoluteJoint) getWorld().createJoint(rjd); } { CircleShape circle_shape = new CircleShape(); circle_shape.m_radius = 3.0f; BodyDef circle_bd = new BodyDef(); circle_bd.type = BodyType.DYNAMIC; circle_bd.position.set(5.0f, 30.0f); FixtureDef fd = new FixtureDef(); fd.density = 5.0f; fd.filter.maskBits = 1; fd.shape = circle_shape; Body ball = m_world.createBody(circle_bd); ball.createFixture(fd); PolygonShape polygon_shape = new PolygonShape(); polygon_shape.setAsBox(10.0f, 0.2f, new Vec2(-10.0f, 0.0f), 0.0f); BodyDef polygon_bd = new BodyDef(); polygon_bd.position.set(20.0f, 10.0f); polygon_bd.type = BodyType.DYNAMIC; polygon_bd.bullet = true; Body polygon_body = m_world.createBody(polygon_bd); polygon_body.createFixture(polygon_shape, 2.0f); RevoluteJointDef rjd = new RevoluteJointDef(); rjd.initialize(ground, polygon_body, new Vec2(20.0f, 10.0f)); rjd.lowerAngle = -0.25f*MathUtils.PI; rjd.upperAngle = 0.0f*MathUtils.PI; rjd.enableLimit = true; m_world.createJoint(rjd); } // Tests mass computation of a small object far from the origin { BodyDef bodyDef = new BodyDef(); bodyDef.type = BodyType.DYNAMIC; Body body = m_world.createBody(bodyDef); PolygonShape polyShape = new PolygonShape(); Vec2[] verts = new Vec2[3]; verts[0] = new Vec2(17.63f, 36.31f); verts[1] = new Vec2(17.52f, 36.69f); verts[2] = new Vec2(17.19f, 36.36f); polyShape.set(verts, 3); FixtureDef polyFixtureDef = new FixtureDef(); polyFixtureDef.shape = polyShape; polyFixtureDef.density = 1; body.createFixture(polyFixtureDef); // assertion hits inside here } }
public override void keyPressed(char argKeyChar, int argKeyCode) { switch (argKeyChar) { case ',': if (m_bullet != null) { getWorld().destroyBody(m_bullet); m_bullet = null; } { CircleShape shape = new CircleShape(); shape.m_radius = 0.25f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.restitution = 0.05f; BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.bullet = true; bd.position.set(-31.0f, 5.0f); m_bullet = getWorld().createBody(bd); m_bullet.createFixture(fd); m_bullet.setLinearVelocity(new Vec2(400.0f, 0.0f)); } break; } }
public override void keyPressed(char key, int argKeyCode) { switch (key) { case 'c': if (m_fixture2 == null) { CircleShape shape = new CircleShape(); shape.m_radius = 3.0f; shape.m_p.set(0.5f, -4.0f); m_fixture2 = m_body.createFixture(shape, 10.0f); m_body.setAwake(true); } break; case 'd': if (m_fixture2 != null) { m_body.destroyFixture(m_fixture2); m_fixture2 = null; m_body.setAwake(true); } break; } }
public override void initTest(bool argDeserialized) { if (argDeserialized) { return; } m_offset.set(0.0f, 8.0f); m_motorSpeed = 2.0f; m_motorOn = true; Vec2 pivot = new Vec2(0.0f, 0.8f); // Ground { BodyDef bd = new BodyDef(); Body ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-50.0f, 0.0f), new Vec2(50.0f, 0.0f)); ground.createFixture(shape, 0.0f); shape.set(new Vec2(-50.0f, 0.0f), new Vec2(-50.0f, 10.0f)); ground.createFixture(shape, 0.0f); shape.set(new Vec2(50.0f, 0.0f), new Vec2(50.0f, 10.0f)); ground.createFixture(shape, 0.0f); } // Balls for (int i = 0; i < 40; ++i) { CircleShape shape = new CircleShape(); shape.m_radius = 0.25f; BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(-40.0f + 2.0f*i, 0.5f); Body body = getWorld().createBody(bd); body.createFixture(shape, 1.0f); } // Chassis { PolygonShape shape = new PolygonShape(); shape.setAsBox(2.5f, 1.0f); FixtureDef sd = new FixtureDef(); sd.density = 1.0f; sd.shape = shape; sd.filter.groupIndex = -1; BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(pivot); bd.position.addLocal(m_offset); m_chassis = getWorld().createBody(bd); m_chassis.createFixture(sd); } { CircleShape shape = new CircleShape(); shape.m_radius = 1.6f; FixtureDef sd = new FixtureDef(); sd.density = 1.0f; sd.shape = shape; sd.filter.groupIndex = -1; BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(pivot); bd.position.addLocal(m_offset); m_wheel = getWorld().createBody(bd); m_wheel.createFixture(sd); } { RevoluteJointDef jd = new RevoluteJointDef(); jd.initialize(m_wheel, m_chassis, pivot.add(m_offset)); jd.collideConnected = false; jd.motorSpeed = m_motorSpeed; jd.maxMotorTorque = 400.0f; jd.enableMotor = m_motorOn; m_motorJoint = (RevoluteJoint) getWorld().createJoint(jd); } Vec2 wheelAnchor; wheelAnchor = pivot.add(new Vec2(0.0f, -0.8f)); createLeg(-1.0f, wheelAnchor); createLeg(1.0f, wheelAnchor); m_wheel.setTransform(m_wheel.getPosition(), 120.0f*MathUtils.PI/180.0f); createLeg(-1.0f, wheelAnchor); createLeg(1.0f, wheelAnchor); m_wheel.setTransform(m_wheel.getPosition(), -120.0f*MathUtils.PI/180.0f); createLeg(-1.0f, wheelAnchor); createLeg(1.0f, wheelAnchor); }
public override void initTest(bool deserialized) { { BodyDef bd = new BodyDef(); Body ground = m_world.createBody(bd); { PolygonShape shape = new PolygonShape(); Vec2[] vertices = new Vec2[] {new Vec2(-40, -10), new Vec2(40, -10), new Vec2(40, 0), new Vec2(-40, 0)}; shape.set(vertices, 4); ground.createFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); Vec2[] vertices = new Vec2[] {new Vec2(-40, -1), new Vec2(-20, -1), new Vec2(-20, 20), new Vec2(-40, 30)}; shape.set(vertices, 4); ground.createFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); Vec2[] vertices = new Vec2[] {new Vec2(20, -1), new Vec2(40, -1), new Vec2(40, 30), new Vec2(20, 20)}; shape.set(vertices, 4); ground.createFixture(shape, 0.0f); } } m_world.setParticleRadius(0.2f); { PolygonShape shape = new PolygonShape(); shape.setAsBox(20, 10, new Vec2(0, 10), 0); ParticleGroupDef pd = new ParticleGroupDef(); pd.flags = flags; pd.shape = shape; m_world.createParticleGroup(pd); } { BodyDef bd = new BodyDef(); bd.type = BodyType.KINEMATIC; Body body = m_world.createBody(bd); circle = body; CircleShape shape = new CircleShape(); shape.m_p.set(0, 5); shape.m_radius = 1; body.createFixture(shape, 0.1f); body.setLinearVelocity(new Vec2(-6, 0.0f)); } { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; Body body = m_world.createBody(bd); PolygonShape shape = new PolygonShape(); shape.setAsBox(1, 1, new Vec2(-10, 5), 0); body.createFixture(shape, 0.1f); } { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; Body body = m_world.createBody(bd); PolygonShape shape = new PolygonShape(); shape.setAsBox(1, 1, new Vec2(10, 5), 0.5f); body.createFixture(shape, 0.1f); } { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; Body body = m_world.createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(0, 20), new Vec2(1, 21)); body.createFixture(shape, 0.1f); } { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; Body body = m_world.createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(3, 20), new Vec2(4, 21)); body.createFixture(shape, 0.1f); } { BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; Body body = m_world.createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-3, 21), new Vec2(-2, 20)); body.createFixture(shape, 0.1f); } }
public override void initTest(bool argDeserialized) { Body ground = null; { BodyDef bd = new BodyDef(); ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(50.0f, 0.0f), new Vec2(-50.0f, 0.0f)); ground.createFixture(shape, 0.0f); } { CircleShape circle1 = new CircleShape(); circle1.m_radius = 1.0f; PolygonShape box = new PolygonShape(); box.setAsBox(0.5f, 5.0f); CircleShape circle2 = new CircleShape(); circle2.m_radius = 2.0f; BodyDef bd1 = new BodyDef(); bd1.type = BodyType.STATIC; bd1.position.set(10.0f, 9.0f); Body body1 = m_world.createBody(bd1); body1.createFixture(circle1, 5.0f); BodyDef bd2 = new BodyDef(); bd2.type = BodyType.DYNAMIC; bd2.position.set(10.0f, 8.0f); Body body2 = m_world.createBody(bd2); body2.createFixture(box, 5.0f); BodyDef bd3 = new BodyDef(); bd3.type = BodyType.DYNAMIC; bd3.position.set(10.0f, 6.0f); Body body3 = m_world.createBody(bd3); body3.createFixture(circle2, 5.0f); RevoluteJointDef jd1 = new RevoluteJointDef(); jd1.initialize(body2, body1, bd1.position); Joint joint1 = m_world.createJoint(jd1); RevoluteJointDef jd2 = new RevoluteJointDef(); jd2.initialize(body2, body3, bd3.position); Joint joint2 = m_world.createJoint(jd2); GearJointDef jd4 = new GearJointDef(); jd4.bodyA = body1; jd4.bodyB = body3; jd4.joint1 = joint1; jd4.joint2 = joint2; jd4.ratio = circle2.m_radius/circle1.m_radius; m_world.createJoint(jd4); } { CircleShape circle1 = new CircleShape(); circle1.m_radius = 1.0f; CircleShape circle2 = new CircleShape(); circle2.m_radius = 2.0f; PolygonShape box = new PolygonShape(); box.setAsBox(0.5f, 5.0f); BodyDef bd1 = new BodyDef(); bd1.type = BodyType.DYNAMIC; bd1.position.set(-3.0f, 12.0f); Body body1 = m_world.createBody(bd1); body1.createFixture(circle1, 5.0f); RevoluteJointDef jd1 = new RevoluteJointDef(); jd1.bodyA = ground; jd1.bodyB = body1; ground.getLocalPointToOut(bd1.position, ref jd1.localAnchorA); body1.getLocalPointToOut(bd1.position, ref jd1.localAnchorB); jd1.referenceAngle = body1.getAngle() - ground.getAngle(); m_joint1 = (RevoluteJoint) m_world.createJoint(jd1); BodyDef bd2 = new BodyDef(); bd2.type = BodyType.DYNAMIC; bd2.position.set(0.0f, 12.0f); Body body2 = m_world.createBody(bd2); body2.createFixture(circle2, 5.0f); RevoluteJointDef jd2 = new RevoluteJointDef(); jd2.initialize(ground, body2, bd2.position); m_joint2 = (RevoluteJoint) m_world.createJoint(jd2); BodyDef bd3 = new BodyDef(); bd3.type = BodyType.DYNAMIC; bd3.position.set(2.5f, 12.0f); Body body3 = m_world.createBody(bd3); body3.createFixture(box, 5.0f); PrismaticJointDef jd3 = new PrismaticJointDef(); jd3.initialize(ground, body3, bd3.position, new Vec2(0.0f, 1.0f)); jd3.lowerTranslation = -5.0f; jd3.upperTranslation = 5.0f; jd3.enableLimit = true; m_joint3 = (PrismaticJoint) m_world.createJoint(jd3); GearJointDef jd4 = new GearJointDef(); jd4.bodyA = body1; jd4.bodyB = body2; jd4.joint1 = m_joint1; jd4.joint2 = m_joint2; jd4.ratio = circle2.m_radius/circle1.m_radius; m_joint4 = (GearJoint) m_world.createJoint(jd4); GearJointDef jd5 = new GearJointDef(); jd5.bodyA = body2; jd5.bodyB = body3; jd5.joint1 = m_joint2; jd5.joint2 = m_joint3; jd5.ratio = 1f/circle2.m_radius; m_joint5 = (GearJoint) m_world.createJoint(jd5); } }
public override void initTest(bool deserialized) { if (deserialized) { return; } float y = 16.0f; float L = 12.0f; float a = 1.0f; float b = 2.0f; Body ground = null; { BodyDef bd = new BodyDef(); ground = getWorld().createBody(bd); EdgeShape shape = new EdgeShape(); shape.set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.createFixture(shape, 0.0f); CircleShape circle = new CircleShape(); circle.m_radius = 2.0f; circle.m_p.set(-10.0f, y + b + L); ground.createFixture(circle, 0.0f); circle.m_p.set(10.0f, y + b + L); ground.createFixture(circle, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.setAsBox(a, b); BodyDef bd = new BodyDef(); bd.type = BodyType.DYNAMIC; bd.position.set(-10.0f, y); Body body1 = getWorld().createBody(bd); body1.createFixture(shape, 5.0f); bd.position.set(10.0f, y); Body body2 = getWorld().createBody(bd); body2.createFixture(shape, 5.0f); PulleyJointDef pulleyDef = new PulleyJointDef(); Vec2 anchor1 = new Vec2(-10.0f, y + b); Vec2 anchor2 = new Vec2(10.0f, y + b); Vec2 groundAnchor1 = new Vec2(-10.0f, y + b + L); Vec2 groundAnchor2 = new Vec2(10.0f, y + b + L); pulleyDef.initialize(body1, body2, groundAnchor1, groundAnchor2, anchor1, anchor2, 2.0f); m_joint1 = (PulleyJoint) getWorld().createJoint(pulleyDef); } }