public Web() { Body ground = null; { BodyDef bd = new BodyDef(); ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(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.5f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(-5.0f, 5.0f); m_bodies[0] = m_world.CreateBody(bd); m_bodies[0].CreateFixture(shape, 5.0f); bd.Position = new Vec2(5.0f, 5.0f); m_bodies[1] = m_world.CreateBody(bd); m_bodies[1].CreateFixture(shape, 5.0f); bd.Position = new Vec2(5.0f, 15.0f); m_bodies[2] = m_world.CreateBody(bd); m_bodies[2].CreateFixture(shape, 5.0f); bd.Position = new Vec2(-5.0f, 15.0f); m_bodies[3] = m_world.CreateBody(bd); m_bodies[3].CreateFixture(shape, 5.0f); DistanceJointDef jd = new DistanceJointDef(); Vec2 p1, p2, d; jd.FrequencyHz = 4.0f; jd.DampingRatio = 0.5f; jd.BodyA = ground; jd.BodyB = m_bodies[0]; jd.LocalAnchorA = new Vec2(-10.0f, 0.0f); jd.LocalAnchorB = new Vec2(-0.5f, -0.5f); p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[0] = m_world.CreateJoint(jd); jd.BodyA = ground; jd.BodyB = m_bodies[1]; jd.LocalAnchorA = new Vec2(10.0f, 0.0f); jd.LocalAnchorB = new Vec2(0.5f, -0.5f); p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[1] = m_world.CreateJoint(jd); jd.BodyA = ground; jd.BodyB = m_bodies[2]; jd.LocalAnchorA = new Vec2(10.0f, 20.0f); jd.LocalAnchorB = new Vec2(0.5f, 0.5f); p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[2] = m_world.CreateJoint(jd); jd.BodyA = ground; jd.BodyB = m_bodies[3]; jd.LocalAnchorA = new Vec2(-10.0f, 20.0f); jd.LocalAnchorB = new Vec2(-0.5f, 0.5f); p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[3] = m_world.CreateJoint(jd); jd.BodyA = m_bodies[0]; jd.BodyB = m_bodies[1]; jd.LocalAnchorA = new Vec2(0.5f, 0.0f); jd.LocalAnchorB = new Vec2(-0.5f, 0.0f);; p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[4] = m_world.CreateJoint(jd); jd.BodyA = m_bodies[1]; jd.BodyB = m_bodies[2]; jd.LocalAnchorA = new Vec2(0.0f, 0.5f); jd.LocalAnchorB = new Vec2(0.0f, -0.5f); p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[5] = m_world.CreateJoint(jd); jd.BodyA = m_bodies[2]; jd.BodyB = m_bodies[3]; jd.LocalAnchorA = new Vec2(-0.5f, 0.0f); jd.LocalAnchorB = new Vec2(0.5f, 0.0f); p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[6] = m_world.CreateJoint(jd); jd.BodyA = m_bodies[3]; jd.BodyB = m_bodies[0]; jd.LocalAnchorA = new Vec2(0.0f, -0.5f); jd.LocalAnchorB = new Vec2(0.0f, 0.5f); p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[7] = m_world.CreateJoint(jd); } }
public Dominos() { Body b1 = m_world.CreateBody(new BodyDef()); b1.CreateFixture(new PolygonShape(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)), 0.0f); b1.UserData = 1; { Body ground = m_world.CreateBody(new BodyDef(BodyType.Static, new Vec2(-1.5f, 10.0f))); ground.CreateFixture(new PolygonShape(6.0f, 0.25f), 0.0f); ground.UserData = "ground"; } for (int i = 0; i < 10; ++i) { Body body = m_world.CreateBody(new BodyDef(BodyType.Dynamic, new Vec2(-6.0f + 1.0f * i, 11.25f), 0)); body.CreateFixture(new FixtureDef(new PolygonShape(0.1f, 1.0f), 20.0f, 0.0f, 0.1f)); body.UserData = "domino " + i.ToString(); } { Body ground = m_world.CreateBody(new BodyDef(BodyType.Static, new Vec2(1.0f, 6.0f))); ground.CreateFixture(new PolygonShape(7.0f, 0.25f, Vec2.Empty, 0.3f), 0.0f); ground.UserData = "ground"; } Body b2; { b2 = m_world.CreateBody(new BodyDef(BodyType.Static, new Vec2(-7.0f, 4.0f))); b2.CreateFixture(new PolygonShape(0.25f, 1.5f), 0.0f); b2.UserData = b2; } Body b3; { b3 = m_world.CreateBody(new BodyDef(BodyType.Dynamic, new Vec2(-0.9f, 1.0f), -0.15f)); b3.CreateFixture(new PolygonShape(6.0f, 0.125f), 10.0f); b3.UserData = 3; } RevoluteJointDef jd = new RevoluteJointDef(); Vec2 anchor = new Vec2(-2.0f, 1.0f); jd.Initialize(b1, b3, anchor); jd.CollideConnected = true; m_world.CreateJoint(jd); Body b4; { b4 = m_world.CreateBody(new BodyDef(BodyType.Dynamic, new Vec2(-10.0f, 15.0f))); b4.CreateFixture(new PolygonShape(0.25f, 0.25f), 10.0f); b4.UserData = 4; } anchor = new Vec2(-7.0f, 15.0f); jd.Initialize(b2, b4, anchor); m_world.CreateJoint(jd); Body b5; { b5 = m_world.CreateBody(new BodyDef(BodyType.Dynamic, new Vec2(6.5f, 3.0f))); b5.CreateFixture(new FixtureDef(new PolygonShape(1.0f, 0.1f, new Vec2(0.0f, -0.9f), 0.0f), 10.0f, 0.0f, 0.1f)); b5.CreateFixture(new FixtureDef(new PolygonShape(0.1f, 1.0f, new Vec2(-0.9f, 0.0f), 0.0f), 10.0f, 0.0f, 0.1f)); b5.CreateFixture(new FixtureDef(new PolygonShape(0.1f, 1.0f, new Vec2(0.9f, 0.0f), 0.0f), 10.0f, 0.0f, 0.1f)); b5.UserData = 5; } anchor = new Vec2(6.0f, 2.0f); jd.Initialize(b1, b5, anchor); m_world.CreateJoint(jd); Body b6; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(1.0f, 0.1f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(6.5f, 4.1f); b6 = m_world.CreateBody(bd); b6.CreateFixture(shape, 30.0f); b6.UserData = 6; } anchor = new Vec2(7.5f, 4.0f); jd.Initialize(b5, b6, anchor); m_world.CreateJoint(jd); Body b7; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.1f, 1.0f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(7.4f, 1.0f); b7 = m_world.CreateBody(bd); b7.CreateFixture(shape, 10.0f); b7.UserData = 7; } DistanceJointDef djd = new DistanceJointDef(); djd.BodyA = b3; djd.BodyB = b7; djd.LocalAnchorA = new Vec2(6.0f, 0.0f); djd.LocalAnchorB = new Vec2(0.0f, -1.0f); Vec2 d = djd.BodyB.GetWorldPoint(djd.LocalAnchorB) - djd.BodyA.GetWorldPoint(djd.LocalAnchorA); djd.Length = d.Length(); m_world.CreateJoint(djd); { float radius = 0.2f; CircleShape shape = new CircleShape(); shape.Radius = radius; for (int i = 0; i < 4; ++i) { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(5.9f + 2.0f * radius * i, 2.4f); Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 10.0f); body.UserData = "circle"; } } }
public Cloth() { FixtureDef boxFix = new FixtureDef(new CircleShape(ClothBodySize), 0.2f); BodyDef boxBod = new BodyDef(BodyType.Dynamic, Vec2.Empty); boxFix.Filter.GroupIndex = -1; boxBod.Position = new Vec2(-ClothTotalWidth / 2, 30); Body bar; { bar = m_world.CreateBody(new BodyDef(BodyType.Static, new Vec2(-ClothBodySpacingWidth / 2, 30))); var fd = new FixtureDef(new PolygonShape((ClothTotalWidth / 2) + ClothBodySpacingWidth, 0.25f)); fd.Filter.GroupIndex = -1; bar.CreateFixture(fd); } for (int y = 0; y < ClothSegmentsHeight; ++y) { for (int x = 0; x < ClothSegmentsWidth; ++x) { Body body = m_world.CreateBody(boxBod); boxBod.Position += new Vec2(ClothBodySpacingWidth, 0); body.CreateFixture(boxFix); if (y == 0) { WeldJointDef wjd = new WeldJointDef(); wjd.Initialize(body, bar, body.WorldCenter); m_world.CreateJoint(wjd); } cloth[x, y] = body; } boxBod.Position = new Vec2(-ClothTotalWidth / 2, boxBod.Position.Y - ClothBodySpacingWidth); } for (int y = 0; y < ClothSegmentsHeight; ++y) { for (int x = 0; x < ClothSegmentsWidth; ++x) { Body leftBody, rightBody; DistanceJointDef djd = new DistanceJointDef(); djd.FrequencyHz = 15 + Rand.RandomFloat(0, 6); djd.DampingRatio = 0.11f + Rand.RandomFloat(0.01f, 0.15f); // connect to right if (x != ClothSegmentsWidth - 1) { leftBody = cloth[x, y]; rightBody = cloth[x + 1, y]; djd.Initialize(leftBody, rightBody, leftBody.WorldCenter, rightBody.WorldCenter); m_world.CreateJoint(djd); } // connect to up if (y != 0) { leftBody = cloth[x, y]; rightBody = cloth[x, y - 1]; djd.Initialize(leftBody, rightBody, leftBody.WorldCenter, rightBody.WorldCenter); m_world.CreateJoint(djd); } } } }
void CreateLeg(float s, Vec2 wheelAnchor) { Vec2 p1 = new Vec2(5.4f * s, -6.1f); Vec2 p2 = new Vec2(7.2f * s, -1.2f); Vec2 p3 = new Vec2(4.3f * s, -1.9f); Vec2 p4 = new Vec2(3.1f * s, 0.8f); Vec2 p5 = new Vec2(6.0f * s, 1.5f); Vec2 p6 = new Vec2(2.5f * s, 3.7f); FixtureDef fd1 = new FixtureDef(), fd2 = new FixtureDef(); fd1.Filter.GroupIndex = fd2.Filter.GroupIndex = -1; fd1.Density = 1.0f; fd2.Density = 1.0f; PolygonShape poly1 = new PolygonShape(), poly2 = new PolygonShape(); if (s > 0.0f) { Vec2[] vertices = new Vec2[3]; vertices[0] = p1; vertices[1] = p2; vertices[2] = p3; poly1.Vertices = vertices; vertices[0] = Vec2.Empty; vertices[1] = p5 - p4; vertices[2] = p6 - p4; poly2.Vertices = vertices; } else { Vec2[] vertices = new Vec2[3]; vertices[0] = p1; vertices[1] = p3; vertices[2] = p2; poly1.Vertices = vertices; vertices[0] = Vec2.Empty; vertices[1] = p6 - p4; vertices[2] = p5 - p4; poly2.Vertices = vertices; } fd1.Shape = poly1; fd2.Shape = poly2; BodyDef bd1 = new BodyDef(), bd2 = new BodyDef(); bd1.BodyType = BodyType.Dynamic; bd2.BodyType = BodyType.Dynamic; bd1.Position = m_offset; bd2.Position = p4 + m_offset; bd1.AngularDamping = 10.0f; bd2.AngularDamping = 10.0f; Body body1 = m_world.CreateBody(bd1); Body body2 = m_world.CreateBody(bd2); body1.CreateFixture(fd1); body2.CreateFixture(fd2); DistanceJointDef djd = new DistanceJointDef(); // Using a soft distance constraint can reduce some jitter. // It also makes the structure seem a bit more fluid by // acting like a suspension system. djd.DampingRatio = 0.5f; djd.FrequencyHz = 10.0f; djd.Initialize(body1, body2, p2 + m_offset, p5 + m_offset); m_world.CreateJoint(djd); djd.Initialize(body1, body2, p3 + m_offset, p4 + m_offset); m_world.CreateJoint(djd); djd.Initialize(body1, m_wheel, p3 + m_offset, wheelAnchor + m_offset); m_world.CreateJoint(djd); djd.Initialize(body2, m_wheel, p6 + m_offset, wheelAnchor + m_offset); m_world.CreateJoint(djd); RevoluteJointDef rjd = new RevoluteJointDef(); rjd.Initialize(body2, m_chassis, p4 + m_offset); m_world.CreateJoint(rjd); }