public Test() { AABB aabb = new AABB(); aabb.UpperBound = new UnityEngine.Vector2(100,100); aabb.LowerBound = new UnityEngine.Vector2(-100,-100); World world = new World(aabb, new Vector2(0, -1), false); BodyDef groundBodyDef = new BodyDef(); groundBodyDef.Position.Set(0, 0); PolygonShape groundBox = new PolygonShape(); groundBox.SetAsBox(10, 1); Body body = new Body(groundBodyDef, world); }
public TimeOfImpact() { { _shapeA = new PolygonShape(); _shapeA.SetAsBox(10.0f, 0.2f); } { _shapeB = new PolygonShape(); _shapeB.SetAsBox(2.0f, 0.1f); } }
public DistanceTest() { { _polygonA = new PolygonShape(); _transformA.SetIdentity(); _transformA.Position.Set(0.0f, -0.2f); _polygonA.SetAsBox(10.0f, 0.2f); } { _polygonB = new PolygonShape(); _positionB.Set(12.017401f, 0.13678508f); _angleB = -0.0109265f; _transformB.Set(_positionB, _angleB); _polygonB.SetAsBox(2.0f, 0.1f); } }
public Chain() { Body ground = null; { BodyDef bd = new BodyDef(); ground = _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); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.6f, 0.125f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 20.0f; fd.Friction = 0.2f; RevoluteJointDef jd = new RevoluteJointDef(); jd.CollideConnected = false; const float y = 25.0f; Body prevBody = ground; for (int i = 0; i < 30; ++i) { BodyDef bd = new BodyDef(); bd.Position.Set(0.5f + i, y); Body body = _world.CreateBody(bd); body.CreateFixture(fd); Vec2 anchor = new Vec2(i, y); jd.Initialize(prevBody, body, anchor); _world.CreateJoint(jd); prevBody = body; } } }
public Pulleys() { Body ground = null; { BodyDef bd = new BodyDef(); ground = _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); } { float a = 2.0f; float b = 4.0f; float y = 16.0f; float L = 12.0f; PolygonShape shape = new PolygonShape(); shape.SetAsBox(a, b); BodyDef bd = new BodyDef(); bd.Position.Set(-10.0f, y); Body body1 = _world.CreateBody(bd); body1.CreateFixture(shape, 5.0f); bd.Position.Set(10.0f, y); Body body2 = _world.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); _joint1 = (PulleyJoint)_world.CreateJoint(pulleyDef); } }
public Prismatic() { Body ground = null; { BodyDef bd = new BodyDef(); ground = _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); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(2.0f, 0.5f); BodyDef bd = new BodyDef(); bd.Position.Set(-10.0f, 10.0f); bd.Angle = 0.5f * Box2DX.Common.Settings.PI; Body body = _world.CreateBody(bd); body.CreateFixture(shape, 5.0f); PrismaticJointDef pjd = new PrismaticJointDef(); // Bouncy limit pjd.Initialize(ground, body, new Vec2(0.0f, 0.0f), new Vec2(1.0f, 0.0f)); // Non-bouncy limit //pjd.Initialize(ground, body, b2Vec2(-10.0f, 10.0f), b2Vec2(1.0f, 0.0f)); pjd.MotorSpeed = 10.0f; pjd.MaxMotorForce = 1000.0f; pjd.EnableMotor = true; pjd.LowerTranslation = 0.0f; pjd.UpperTranslation = 20.0f; pjd.EnableLimit = true; _joint = (PrismaticJoint)_world.CreateJoint(pjd); } }
public Pyramid() { { BodyDef bd = new BodyDef(); Body ground = _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); } { float a = 0.5f; PolygonShape shape = new PolygonShape(); shape.SetAsBox(a, a); Vec2 x = new Vec2(-7.0f, 0.75f); Vec2 y; Vec2 deltaX = new Vec2(0.5625f, 1.25f); Vec2 deltaY = new Vec2(1.125f, 0.0f); for (int i = 0; i < _count; ++i) { y = x; for (int j = i; j < _count; ++j) { BodyDef bd = new BodyDef(); bd.Position = y; Body body = _world.CreateBody(bd); body.CreateFixture(shape, 5.0f); y += deltaY; } x += deltaX; } } }
public CollisionProcessing() { // Ground body { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(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 = _world.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].Set(-1.0f, 0.0f); vertices[1].Set(1.0f, 0.0f); vertices[2].Set(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.Position.Set(Math.Random(xLo, xHi), Math.Random(yLo, yHi)); Body body1 = _world.CreateBody(triangleBodyDef); body1.CreateFixture(triangleShapeDef); // Large triangle (recycle definitions) vertices[0] *= 2.0f; vertices[1] *= 2.0f; vertices[2] *= 2.0f; polygon.Set(vertices, 3); triangleBodyDef.Position.Set(Math.Random(xLo, xHi), Math.Random(yLo, yHi)); Body body2 = _world.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.Position.Set(Math.Random(xLo, xHi), Math.Random(yLo, yHi)); Body body3 = _world.CreateBody(boxBodyDef); body3.CreateFixture(boxShapeDef); // Large box (recycle definitions) polygon.SetAsBox(2.0f, 1.0f); boxBodyDef.Position.Set(Math.Random(xLo, xHi), Math.Random(yLo, yHi)); Body body4 = _world.CreateBody(boxBodyDef); body4.CreateFixture(boxShapeDef); // Small circle CircleShape circle = new CircleShape(); circle._radius = 1.0f; FixtureDef circleShapeDef = new FixtureDef(); circleShapeDef.Shape = circle; circleShapeDef.Density = 1.0f; BodyDef circleBodyDef = new BodyDef(); circleBodyDef.Position.Set(Math.Random(xLo, xHi), Math.Random(yLo, yHi)); Body body5 = _world.CreateBody(circleBodyDef); body5.CreateFixture(circleShapeDef); // Large circle circle._radius *= 2.0f; circleBodyDef.Position.Set(Math.Random(xLo, xHi), Math.Random(yLo, yHi)); Body body6 = _world.CreateBody(circleBodyDef); body6.CreateFixture(circleShapeDef); }
public CollisionFiltering() { // Ground body { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(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 = _world.CreateBody(bd); ground.CreateFixture(sd); } // Small triangle Vec2[] vertices = new Vec2[3]; vertices[0].Set(-1.0f, 0.0f); vertices[1].Set(1.0f, 0.0f); vertices[2].Set(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.Position.Set(-5.0f, 2.0f); Body body1 = _world.CreateBody(triangleBodyDef); body1.CreateFixture(triangleShapeDef); // Large triangle (recycle definitions) vertices[0] *= 2.0f; vertices[1] *= 2.0f; vertices[2] *= 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 = _world.CreateBody(triangleBodyDef); body2.CreateFixture(triangleShapeDef); // 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.Position.Set(0.0f, 2.0f); Body body3 = _world.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 = _world.CreateBody(boxBodyDef); body4.CreateFixture(boxShapeDef); // Small circle CircleShape circle = new CircleShape(); circle._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.Position.Set(5.0f, 2.0f); Body body5 = _world.CreateBody(circleBodyDef); body5.CreateFixture(circleShapeDef); // Large circle circle._radius *= 2.0f; circleShapeDef.Filter.GroupIndex = k_largeGroup; circleBodyDef.Position.Set(5.0f, 6.0f); Body body6 = _world.CreateBody(circleBodyDef); body6.CreateFixture(circleShapeDef); }
public Web() { Body ground = null; { BodyDef bd = new BodyDef(); ground = _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); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.5f); BodyDef bd = new BodyDef(); bd.Position.Set(-5.0f, 5.0f); _bodies[0] = _world.CreateBody(bd); _bodies[0].CreateFixture(shape, 0); bd.Position.Set(5.0f, 5.0f); _bodies[1] = _world.CreateBody(bd); _bodies[1].CreateFixture(shape, 0); bd.Position.Set(5.0f, 15.0f); _bodies[2] = _world.CreateBody(bd); _bodies[2].CreateFixture(shape, 0); bd.Position.Set(-5.0f, 15.0f); _bodies[3] = _world.CreateBody(bd); _bodies[3].CreateFixture(shape, 0); DistanceJointDef jd = new DistanceJointDef(); Vec2 p1, p2, d; jd.FrequencyHz = 4.0f; jd.DampingRatio = 0.5f; jd.Body1 = ground; jd.Body2 = _bodies[0]; jd.LocalAnchor1.Set(-10.0f, 10.0f); jd.LocalAnchor2.Set(-0.5f, -0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[0] = _world.CreateJoint(jd); jd.Body1 = ground; jd.Body2 = _bodies[1]; jd.LocalAnchor1.Set(10.0f, 10.0f); jd.LocalAnchor2.Set(0.5f, -0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[1] = _world.CreateJoint(jd); jd.Body1 = ground; jd.Body2 = _bodies[2]; jd.LocalAnchor1.Set(10.0f, 30.0f); jd.LocalAnchor2.Set(0.5f, 0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[2] = _world.CreateJoint(jd); jd.Body1 = ground; jd.Body2 = _bodies[3]; jd.LocalAnchor1.Set(-10.0f, 30.0f); jd.LocalAnchor2.Set(-0.5f, 0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[3] = _world.CreateJoint(jd); jd.Body1 = _bodies[0]; jd.Body2 = _bodies[1]; jd.LocalAnchor1.Set(0.5f, 0.0f); jd.LocalAnchor2.Set(-0.5f, 0.0f); ; p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[4] = _world.CreateJoint(jd); jd.Body1 = _bodies[1]; jd.Body2 = _bodies[2]; jd.LocalAnchor1.Set(0.0f, 0.5f); jd.LocalAnchor2.Set(0.0f, -0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[5] = _world.CreateJoint(jd); jd.Body1 = _bodies[2]; jd.Body2 = _bodies[3]; jd.LocalAnchor1.Set(-0.5f, 0.0f); jd.LocalAnchor2.Set(0.5f, 0.0f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[6] = _world.CreateJoint(jd); jd.Body1 = _bodies[3]; jd.Body2 = _bodies[0]; jd.LocalAnchor1.Set(0.0f, -0.5f); jd.LocalAnchor2.Set(0.0f, 0.5f); p1 = jd.Body1.GetWorldPoint(jd.LocalAnchor1); p2 = jd.Body2.GetWorldPoint(jd.LocalAnchor2); d = p2 - p1; jd.Length = d.Length(); _joints[7] = _world.CreateJoint(jd); } }
public Dominos() { Body b1; { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); BodyDef bd = new BodyDef(); b1 = _world.CreateBody(bd); b1.CreateFixture(shape,0); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(6.0f, 0.25f); BodyDef bd = new BodyDef(); bd.Position.Set(-1.5f, 10.0f); Body ground = _world.CreateBody(bd); ground.CreateFixture(shape,0); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.1f, 1.0f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 20.0f; fd.Friction = 0.1f; for (int i = 0; i < 10; ++i) { BodyDef bd = new BodyDef(); bd.Position.Set(-6.0f + 1.0f * i, 11.25f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); } } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(7.0f, 0.25f, Vec2.Zero, 0.3f); BodyDef bd = new BodyDef(); bd.Position.Set(1.0f, 6.0f); Body ground = _world.CreateBody(bd); ground.CreateFixture(shape,0); } Body b2; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.25f, 1.5f); BodyDef bd = new BodyDef(); bd.Position.Set(-7.0f, 4.0f); b2 = _world.CreateBody(bd); b2.CreateFixture(shape,0); } Body b3; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(6.0f, 0.125f); BodyDef bd = new BodyDef(); bd.Position.Set(-0.9f, 1.0f); bd.Angle = -0.15f; b3 = _world.CreateBody(bd); b3.CreateFixture(shape, 10.0f); } RevoluteJointDef jd = new RevoluteJointDef(); Vec2 anchor = new Vec2(); anchor.Set(-2.0f, 1.0f); jd.Initialize(b1, b3, anchor); jd.CollideConnected = true; _world.CreateJoint(jd); Body b4; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.25f, 0.25f); BodyDef bd = new BodyDef(); bd.Position.Set(-10.0f, 15.0f); b4 = _world.CreateBody(bd); b4.CreateFixture(shape, 10.0f); } anchor.Set(-7.0f, 15.0f); jd.Initialize(b2, b4, anchor); _world.CreateJoint(jd); Body b5; { BodyDef bd = new BodyDef(); bd.Position.Set(6.5f, 3.0f); b5 = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 10.0f; fd.Friction = 0.1f; shape.SetAsBox(1.0f, 0.1f,new Vec2(0.0f, -0.9f), 0.0f); b5.CreateFixture(fd); shape.SetAsBox(0.1f, 1.0f, new Vec2(-0.9f, 0.0f), 0.0f); b5.CreateFixture(fd); shape.SetAsBox(0.1f, 1.0f,new Vec2(0.9f, 0.0f), 0.0f); b5.CreateFixture(fd); } anchor.Set(6.0f, 2.0f); jd.Initialize(b1, b5, anchor); _world.CreateJoint(jd); Body b6; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(1.0f, 0.1f); BodyDef bd = new BodyDef(); bd.Position.Set(6.5f, 4.1f); b6 = _world.CreateBody(bd); b6.CreateFixture(shape, 30.0f); } anchor.Set(7.5f, 4.0f); jd.Initialize(b5, b6, anchor); _world.CreateJoint(jd); Body b7; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.1f, 1.0f); BodyDef bd = new BodyDef(); bd.Position.Set(7.4f, 1.0f); b7 = _world.CreateBody(bd); b7.CreateFixture(shape, 10.0f); } DistanceJointDef djd =new DistanceJointDef(); djd.Body1 = b3; djd.Body2 = b7; djd.LocalAnchor1.Set(6.0f, 0.0f); djd.LocalAnchor2.Set(0.0f, -1.0f); Vec2 d = djd.Body2.GetWorldPoint(djd.LocalAnchor2) - djd.Body1.GetWorldPoint(djd.LocalAnchor1); djd.Length = d.Length(); _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.Position.Set(5.9f + 2.0f * radius * i, 2.4f); Body body = _world.CreateBody(bd); body.CreateFixture(shape, 10.0f); } } }
public CCDTest() { #if true { //TODO: only one shape is created here instead of two. That is because //they are reference types and when shape is changed, it changes the original instead of a new copy. PolygonShape shape = new PolygonShape(); shape.SetAsBox(10.0f, 0.2f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 0.0f; BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -0.2f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); shape.SetAsBox(0.2f, 1.0f, new Vec2(0.5f, 1.2f), 0.0f); body.CreateFixture(fd); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(2.0f, 0.1f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 1.0f; fd.Restitution = 0.0f; _angularVelocity = Math.Random(-50.0f, 50.0f); _angularVelocity = -30.669577f; BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 20.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); body.SetLinearVelocity(new Vec2(0.0f, -100.0f)); body.SetAngularVelocity(_angularVelocity); } #elif false { FixtureDef fd; fd.SetAsBox(10.0f, 0.1f); fd.density = 0.0f; BodyDef bd; bd.type = BodyDef::e_static; bd.position.Set(0.0f, -0.2f); Body* ground = m_world.CreateBody(&bd); ground.CreateFixture(&fd); } { FixtureDef fd; fd.SetAsBox(2.0f, 0.1f); fd.density = 1.0f; fd.restitution = 0.0f; BodyDef bd1; bd1.type = BodyDef::e_dynamic; bd1.isBullet = true; bd1.allowSleep = false; bd1.position.Set(0.0f, 20.0f); Body* b1 = m_world.Create(&bd1); b1.CreateFixture(&fd); b1.SetMassFromShapes(); b1.SetLinearVelocity(Vec2(0.0f, -100.0f)); fd.SetAsBox(1.0f, 0.1f); BodyDef bd2; bd2.type = BodyDef::e_dynamic; bd2.isBullet = true; bd2.allowSleep = false; bd2.position.Set(0.0f, 20.2f); Body* = m_world.Create(&bd2); .CreateFixture(&fd); .SetMassFromShapes(); .SetLinearVelocity(Vec2(0.0f, -100.0f)); fd.SetAsBox(0.25f, 0.25f); fd.density = 10.0f; BodyDef bd3; bd3.type = BodyDef::e_dynamic; bd3.isBullet = true; bd3.allowSleep = false; bd3.position.Set(0.0f, 100.0f); Body* b3 = m_world.Create(&bd3); b3.CreateFixture(&fd); b3.SetMassFromShapes(); b3.SetLinearVelocity(Vec2(0.0f, -150.0f)); } #else const float32 k_restitution = 1.4f; { BodyDef bd; bd.position.Set(0.0f, 20.0f); Body* body = m_world.CreateBody(&bd); FixtureDef fd; fd.density = 0.0f; fd.restitution = k_restitution; fd.SetAsBox(0.1f, 10.0f, Vec2(-10.0f, 0.0f), 0.0f); body.CreateFixture(&fd); fd.SetAsBox(0.1f, 10.0f, Vec2(10.0f, 0.0f), 0.0f); body.CreateFixture(&fd); fd.SetAsBox(0.1f, 10.0f, Vec2(0.0f, -10.0f), 0.5f * _pi); body.CreateFixture(&fd); fd.SetAsBox(0.1f, 10.0f, Vec2(0.0f, 10.0f), -0.5f * _pi); body.CreateFixture(&fd); } #if false { FixtureDef sd_bottom; sd_bottom.SetAsBox(1.0f, 0.1f, Vec2(0.0f, -1.0f), 0.0f); sd_bottom.density = 4.0f; FixtureDef sd_top; sd_top.SetAsBox(1.0f, 0.1f, Vec2(0.0f, 1.0f), 0.0f); sd_top.density = 4.0f; FixtureDef sd_left; sd_left.SetAsBox(0.1f, 1.0f, Vec2(-1.0f, 0.0f), 0.0f); sd_left.density = 4.0f; FixtureDef sd_right; sd_right.SetAsBox(0.1f, 1.0f, Vec2(1.0f, 0.0f), 0.0f); sd_right.density = 4.0f; BodyDef bd; bd.type = BodyDef::e_dynamicBody; bd.position.Set(0.0f, 15.0f); Body* body = m_world.CreateBody(&bd); body.CreateFixture(&sd_bottom); body.CreateFixture(&sd_top); body.CreateFixture(&sd_left); body.CreateFixture(&sd_right); body.SetMassFromShapes(); } #elif false { FixtureDef sd_bottom; sd_bottom.SetAsBox( 1.5f, 0.15f ); sd_bottom.density = 4.0f; FixtureDef sd_left; sd_left.SetAsBox(0.15f, 2.7f, Vec2(-1.45f, 2.35f), 0.2f); sd_left.density = 4.0f; FixtureDef sd_right; sd_right.SetAsBox(0.15f, 2.7f, Vec2(1.45f, 2.35f), -0.2f); sd_right.density = 4.0f; BodyDef bd; bd.position.Set( 0.0f, 15.0f ); Body* body = m_world.CreateBody(&bd); body.CreateFixture(&sd_bottom); body.CreateFixture(&sd_left); body.CreateFixture(&sd_right); body.SetMassFromShapes(); } #else { BodyDef bd; bd.position.Set(-5.0f, 20.0f); bd.isBullet = true; Body* body = m_world.CreateBody(&bd); body.SetAngularVelocity(RandomFloat(-50.0f, 50.0f)); FixtureDef fd; fd.SetAsBox(0.1f, 4.0f); fd.density = 1.0f; fd.restitution = 0.0f; body.CreateFixture(&fd); body.SetMassFromShapes(); } #endif for (int32 i = 0; i < 0; ++i) { BodyDef bd; bd.position.Set(0.0f, 15.0f + i); bd.isBullet = true; Body* body = m_world.CreateBody(&bd); body.SetAngularVelocity(RandomFloat(-50.0f, 50.0f)); FixtureDef fd; fd.radius = 0.25f; fd.density = 1.0f; fd.restitution = 0.0f; body.CreateFixture(&fd); body.SetMassFromShapes(); } #endif }
public VaryingFriction() { { BodyDef bd = new BodyDef(); Body ground = _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); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(13.0f, 0.25f); BodyDef bd = new BodyDef(); bd.Position.Set(-4.0f, 22.0f); bd.Angle = -0.25f; Body ground = _world.CreateBody(bd); ground.CreateFixture(shape, 0); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.25f, 1.0f); BodyDef bd = new BodyDef(); bd.Position.Set(10.5f, 19.0f); Body ground = _world.CreateBody(bd); ground.CreateFixture(shape, 0); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(13.0f, 0.25f); BodyDef bd = new BodyDef(); bd.Position.Set(4.0f, 14.0f); bd.Angle = 0.25f; Body ground = _world.CreateBody(bd); ground.CreateFixture(shape, 0); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.25f, 1.0f); BodyDef bd = new BodyDef(); bd.Position.Set(-10.5f, 11.0f); Body ground = _world.CreateBody(bd); ground.CreateFixture(shape, 0); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(13.0f, 0.25f); BodyDef bd = new BodyDef(); bd.Position.Set(-4.0f, 6.0f); bd.Angle = -0.25f; Body ground = _world.CreateBody(bd); ground.CreateFixture(shape, 0); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.5f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 25.0f; float[] friction = { 0.75f, 0.5f, 0.35f, 0.1f, 0.0f }; for (int i = 0; i < 5; ++i) { BodyDef bd = new BodyDef(); bd.Position.Set(-15.0f + 4.0f * i, 28.0f); Body body = _world.CreateBody(bd); fd.Friction = friction[i]; body.CreateFixture(fd); } } }
public Bridge() { Body ground = null; { BodyDef bd = new BodyDef(); ground = _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); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.125f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 20.0f; fd.Friction = 0.2f; RevoluteJointDef jd = new RevoluteJointDef(); const int numPlanks = 30; Body prevBody = ground; for (int i = 0; i < _count; ++i) { BodyDef bd = new BodyDef(); bd.Position.Set(-14.5f + 1.0f * i, 5.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); Vec2 anchor = new Vec2(-15.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); _world.CreateJoint(jd); if (i == (_count >> 1)) { _middle = body; } prevBody = body; } Vec2 anchor2 = new Vec2(-15.0f + 1.0f * _count, 5.0f); jd.Initialize(prevBody, ground, anchor2); _world.CreateJoint(jd); } for (int i = 0; i < 2; ++i) { Vec2[] vertices = new Vec2[3]; vertices[0].Set(-0.5f, 0.0f); vertices[1].Set(0.5f, 0.0f); vertices[2].Set(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.Position.Set(-8.0f + 8.0f * i, 12.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); } for (int i = 0; i < 3; ++i) { CircleShape shape = new CircleShape(); shape._radius = 0.5f; FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 1.0f; BodyDef bd = new BodyDef(); bd.Position.Set(-6.0f + 6.0f * i, 10.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); } }
public SliderCrank() { Body ground = null; { BodyDef bd = new BodyDef(); ground = _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); } { Body prevBody = ground; // Define crank. { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 2.0f); BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 7.0f); Body body = _world.CreateBody(bd); body.CreateFixture(shape, 2.0f); RevoluteJointDef rjd = new RevoluteJointDef(); rjd.Initialize(prevBody, body, new Vec2(0.0f, 5.0f)); rjd.MotorSpeed = 1.0f * Box2DX.Common.Settings.PI; rjd.MaxMotorTorque = 10000.0f; rjd.EnableMotor = true; _joint1 = (RevoluteJoint)_world.CreateJoint(rjd); prevBody = body; } // Define follower. { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 4.0f); BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 13.0f); Body body = _world.CreateBody(bd); body.CreateFixture(shape, 2.0f); RevoluteJointDef rjd = new RevoluteJointDef(); rjd.Initialize(prevBody, body, new Vec2(0.0f, 9.0f)); rjd.EnableMotor = false; _world.CreateJoint(rjd); prevBody = body; } // Define piston { PolygonShape shape = new PolygonShape(); shape.SetAsBox(1.5f, 1.5f); BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 17.0f); Body body = _world.CreateBody(bd); body.CreateFixture(shape, 2.0f); RevoluteJointDef rjd = new RevoluteJointDef(); rjd.Initialize(prevBody, body, new Vec2(0.0f, 17.0f)); _world.CreateJoint(rjd); PrismaticJointDef pjd = new PrismaticJointDef(); pjd.Initialize(ground, body, new Vec2(0.0f, 17.0f), new Vec2(0.0f, 1.0f)); pjd.MaxMotorForce = 1000.0f; pjd.EnableMotor = true; _joint2 = (PrismaticJoint)_world.CreateJoint(pjd); } // Create a payload { PolygonShape shape = new PolygonShape(); shape.SetAsBox(1.5f, 1.5f); BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 23.0f); Body body = _world.CreateBody(bd); body.CreateFixture(shape, 2.0f); } } }
public Gears() { Body ground = null; { BodyDef bd = new BodyDef(); ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(50.0f, 0.0f), new Vec2(-50.0f, 0.0f)); ground.CreateFixture(shape, 0); } { CircleShape circle1 = new CircleShape(); circle1._radius = 1.0f; CircleShape circle2 = new CircleShape(); circle2._radius = 2.0f; PolygonShape box = new PolygonShape(); box.SetAsBox(0.5f, 5.0f); BodyDef bd1 = new BodyDef(); bd1.Position.Set(-3.0f, 12.0f); Body body1 = _world.CreateBody(bd1); body1.CreateFixture(circle1, 5.0f); RevoluteJointDef jd1 = new RevoluteJointDef(); jd1.Body1 = ground; jd1.Body2 = body1; jd1.LocalAnchor1 = ground.GetLocalPoint(bd1.Position); jd1.LocalAnchor2 = body1.GetLocalPoint(bd1.Position); jd1.ReferenceAngle = body1.GetAngle() - ground.GetAngle(); _joint1 = (RevoluteJoint)_world.CreateJoint(jd1); BodyDef bd2 = new BodyDef(); bd2.Position.Set(0.0f, 12.0f); Body body2 = _world.CreateBody(bd2); body2.CreateFixture(circle2, 5.0f); RevoluteJointDef jd2 = new RevoluteJointDef(); jd2.Initialize(ground, body2, bd2.Position); _joint2 = (RevoluteJoint)_world.CreateJoint(jd2); BodyDef bd3 = new BodyDef(); bd3.Position.Set(2.5f, 12.0f); Body body3 = _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; _joint3 = (PrismaticJoint)_world.CreateJoint(jd3); GearJointDef jd4 = new GearJointDef(); jd4.Body1 = body1; jd4.Body2 = body2; jd4.Joint1 = _joint1; jd4.Joint2 = _joint2; jd4.Ratio = circle2._radius / circle1._radius; _joint4 = (GearJoint)_world.CreateJoint(jd4); GearJointDef jd5 = new GearJointDef(); jd5.Body1 = body2; jd5.Body2 = body3; jd5.Joint1 = _joint2; jd5.Joint2 = _joint3; jd5.Ratio = -1.0f / circle2._radius; _joint5 = (GearJoint)_world.CreateJoint(jd5); } }
public TheoJansen() { _offset.Set(0.0f, 8.0f); _motorSpeed = 2.0f; _motorOn = true; Vec2 pivot = new Vec2(0.0f, 0.8f); // Ground { BodyDef bd = new BodyDef(); Body ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-50.0f, 0.0f), new Vec2(50.0f, 0.0f)); ground.CreateFixture(shape, 0); shape.SetAsEdge(new Vec2(-50.0f, 0.0f), new Vec2(-50.0f, 10.0f)); ground.CreateFixture(shape, 0); shape.SetAsEdge(new Vec2(50.0f, 0.0f), new Vec2(50.0f, 10.0f)); ground.CreateFixture(shape, 0); } // Balls for (int i = 0; i < 40; ++i) { CircleShape shape = new CircleShape(); shape._radius = 0.25f; BodyDef bd = new BodyDef(); bd.Position.Set(-40.0f + 2.0f * i, 0.5f); Body body = _world.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.Position = pivot + _offset; _chassis = _world.CreateBody(bd); _chassis.CreateFixture(sd); } { CircleShape shape = new CircleShape(); shape._radius = 1.6f; FixtureDef sd = new FixtureDef(); sd.Density = 1.0f; sd.Shape = shape; sd.Filter.GroupIndex = -1; BodyDef bd = new BodyDef(); bd.Position = pivot + _offset; _wheel = _world.CreateBody(bd); _wheel.CreateFixture(sd); } { RevoluteJointDef jd = new RevoluteJointDef(); jd.Initialize(_wheel, _chassis, pivot + _offset); jd.CollideConnected = false; jd.MotorSpeed = _motorSpeed; jd.MaxMotorTorque = 400.0f; jd.EnableMotor = _motorOn; _motorJoint = (RevoluteJoint)_world.CreateJoint(jd); } Vec2 wheelAnchor; wheelAnchor = pivot + new Vec2(0.0f, -0.8f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); _wheel.SetTransform(_wheel.GetPosition(), 120.0f * Box2DX.Common.Settings.PI / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); _wheel.SetTransform(_wheel.GetPosition(), -120.0f * Box2DX.Common.Settings.PI / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); }
public CompoundShapes() { { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 0.0f); Body body = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(50.0f, 0.0f), new Vec2(-50.0f, 0.0f)); body.CreateFixture(shape, 0); } { CircleShape circle1 = new CircleShape(); circle1._radius = 0.5f; circle1._p.Set(-0.5f, 0.5f); CircleShape circle2 = new CircleShape(); circle2._radius = 0.5f; circle2._p.Set(0.5f, 0.5f); for (int i = 0; i < 10; ++i) { float x = Math.Random(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.Position.Set(x + 5.0f, 1.05f + 2.5f * i); bd.Angle = Math.Random(-Box2DX.Common.Settings.PI, Box2DX.Common.Settings.PI); Body body = _world.CreateBody(bd); body.CreateFixture(circle1, 2.0f); body.CreateFixture(circle2, 0); } } { 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 * Box2DX.Common.Settings.PI); for (int i = 0; i < 10; ++i) { float x = Math.Random(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.Position.Set(x - 5.0f, 1.05f + 2.5f * i); bd.Angle = Math.Random(-Box2DX.Common.Settings.PI, Box2DX.Common.Settings.PI); Body body = _world.CreateBody(bd); body.CreateFixture(polygon1, 2.0f); body.CreateFixture(polygon2, 2.0f); } } { Transform xf1 = new Transform(); xf1.R.Set(0.3524f * Box2DX.Common.Settings.PI); xf1.Position = Math.Mul(xf1.R, new Vec2(1.0f, 0.0f)); Vec2[] vertices = new Vec2[3]; PolygonShape triangle1 = new PolygonShape(); vertices[0] = Math.Mul(xf1, new Vec2(-1.0f, 0.0f)); vertices[1] = Math.Mul(xf1, new Vec2(1.0f, 0.0f)); vertices[2] = Math.Mul(xf1, new Vec2(0.0f, 0.5f)); triangle1.Set(vertices, 3); Transform xf2 = new Transform(); xf2.R.Set(-0.3524f * Box2DX.Common.Settings.PI); xf2.Position = Math.Mul(xf2.R, new Vec2(-1.0f, 0.0f)); PolygonShape triangle2 = new PolygonShape(); vertices[0] = Math.Mul(xf2, new Vec2(-1.0f, 0.0f)); vertices[1] = Math.Mul(xf2, new Vec2(1.0f, 0.0f)); vertices[2] = Math.Mul(xf2, new Vec2(0.0f, 0.5f)); triangle2.Set(vertices, 3); for (int i = 0; i < 10; ++i) { float x = Math.Random(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.Position.Set(x, 2.05f + 2.5f * i); bd.Angle = 0.0f; Body body = _world.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.Position.Set(0.0f, 2.0f); Body body = _world.CreateBody(bd); body.CreateFixture(bottom, 4.0f); body.CreateFixture(left, 4.0f); body.CreateFixture(right, 4.0f); } }