/// <summary> /// Creates a new jump component /// </summary> /// <param name="world">The Box2D world that will hold this component</param> /// <param name="content">Used ContentManager</param> /// <param name="pos">The position of this component</param> /// <param name="angle">The rotation angle of this component</param> /// <param name="width">The width of this component</param> /// <param name="height">The height of this component</param> public Jump(World world, ContentManager content, Vector2 pos, float angle, float width, float height) : base(world, content, pos, angle, width, height) { Name = "jump"; texture = content.Load <Texture2D>("Images/" + Name); origin = new Vector2(texture.Width * 0.5f, texture.Height * 0.5f); sourceRect = new Rectangle(1, 1, texture.Width, texture.Height); PolygonShape shape = new PolygonShape(); Vector2[] vertices = { new Vector2(-width * 0.5f / Level.FACTOR, height * 0.5f / Level.FACTOR), new Vector2(width * 0.5f / Level.FACTOR, -height * 0.5f / Level.FACTOR), new Vector2(width * 0.5f / Level.FACTOR, height * 0.5f / Level.FACTOR) }; shape.Set(vertices, 3); body.CreateFixture(shape, 1.0f); }
public Body CreateStaticBox(Vector2 position, Vector2 size, string param = null) { BodyDef bd = new BodyDef(); bd.type = BodyType.Static; bd.position = new System.Numerics.Vector2(position.X / 100, position.Y / 100); bd.fixedRotation = false; bd.gravityScale = 1.000000000000000e+00f; var body = b2DWorld.CreateBody(bd); FixtureDef fd = new FixtureDef(); fd.friction = 2.000000029802322e-01f; fd.restitution = 2.000000029802322e-01f; fd.density = 1.000000000000000e+00f; fd.isSensor = false; fd.userData = param; if (param == "floor") { fd.filter.categoryBits = (ushort)_entityCategory.Floor; fd.filter.maskBits = (ushort)(_entityCategory.Player | _entityCategory.Ball); } PolygonShape shape = new PolygonShape(); System.Numerics.Vector2[] vs = new System.Numerics.Vector2[4]; vs[0] = new Vector2(-(size.X / 2) / 100, -(size.Y / 2) / 100); vs[1] = new Vector2((size.X / 2) / 100, -(size.Y / 2) / 100); vs[2] = new Vector2((size.X / 2) / 100, (size.Y / 2) / 100); vs[3] = new Vector2(-(size.X / 2) / 100, (size.Y / 2) / 100); shape.Set(vs); fd.shape = shape; body.CreateFixture(fd); Bodies.Add(body); return(body); }
void addTri(Vector2 pos) { var tempBody = new BodyDef(); tempBody.position = pos - new Vector2(100, 40); tempBody.type = BodyType.Dynamic; var tempShape = new PolygonShape(); Vector2[] triVertices = new Vector2[3]; triVertices[0] = new Vector2(0, 80); triVertices[1] = new Vector2(100, 0); triVertices[2] = new Vector2(200, 80); tempShape.Set(triVertices, 3); var tempFixture = new FixtureDef(); tempFixture.shape = tempShape; tempFixture.density = 1; Body tempFloor = physicsWorld.CreateBody(tempBody); tempFloor.CreateFixture(tempFixture); }
private EdgeShapeBenchmark() { // Ground body { Body ground = BodyFactory.CreateBody(World); float x1 = -20.0f; float y1 = 2.0f * (float)Math.Cos(x1 / 10.0f * (float)Math.PI); for (int i = 0; i < 80; ++i) { float x2 = x1 + 0.5f; float y2 = 2.0f * (float)Math.Cos(x2 / 10.0f * (float)Math.PI); EdgeShape shape = new EdgeShape(new Vector2(x1, y1), new Vector2(x2, y2)); ground.CreateFixture(shape); x1 = x2; y1 = y2; } } const float w = 1.0f; const float t = 2.0f; float b = w / (2.0f + (float)Math.Sqrt(t)); float s = (float)Math.Sqrt(t) * b; Vertices vertices = new Vertices(8); vertices.Add(new Vector2(0.5f * s, 0.0f)); vertices.Add(new Vector2(0.5f * w, b)); vertices.Add(new Vector2(0.5f * w, b + s)); vertices.Add(new Vector2(0.5f * s, w)); vertices.Add(new Vector2(-0.5f * s, w)); vertices.Add(new Vector2(-0.5f * w, b + s)); vertices.Add(new Vector2(-0.5f * w, b)); vertices.Add(new Vector2(-0.5f * s, 0.0f)); _polyShape = new PolygonShape(20); _polyShape.Set(vertices); }
/// <inheritdoc /> protected override void PostStep() { // Shape.Set(m_points); DrawString("Press g to generate a new random convex hull"); // Todo var shape = new PolygonShape(); shape.Set(m_points); var drawLine = new Vector2[shape.Count + 1]; Array.Copy(shape.Vertices, drawLine, shape.Count); drawLine[drawLine.Length - 1] = shape.Vertices[0]; Drawer.DrawPolygon(drawLine, drawLine.Length, Color.FromArgb(230, 230, 230)); _contents.Clear(); var points = m_points.Select(e => MainCamera.WorldToScreenPoint(e.ToUnityVector2())) .Select(e => new UnityEngine.Vector2(e.x, Screen.height - e.y)) .ToArray(); for (var i = 0; i < m_count; ++i) { Drawer.DrawPoint(m_points[i], 10.0f, Color.FromArgb(77, 230, 77)); WriteString(points[i] + new UnityEngine.Vector2(0.5f, 0.5f), $"{i}"); } Drawer.DrawPoint(Vector2.Zero, 5f, Color.Yellow); // // if (shape.Validate() == false) // { // //m_textLine += 0; // } if (m_auto) { Generate(); } }
public Body CreateStaticBoxSensor(Vector2 position, Vector2 size, string param = null) { BodyDef bd = new BodyDef(); bd.type = BodyType.Static; bd.position = new System.Numerics.Vector2(position.X / 100, position.Y / 100); bd.fixedRotation = false; bd.gravityScale = 1.000000000000000e+00f; var body = b2DWorld.CreateBody(bd); FixtureDef fd = new FixtureDef(); fd.friction = 2.000000029802322e-01f; fd.restitution = 2.000000029802322e-01f; fd.density = 1.000000000000000e+00f; fd.isSensor = true; fd.userData = param; PolygonShape shape = new PolygonShape(); System.Numerics.Vector2[] vs = new System.Numerics.Vector2[4]; vs[0] = new System.Numerics.Vector2(-(size.X / 2) / 100, -(size.Y / 2) / 100); vs[1] = new System.Numerics.Vector2((size.X / 2) / 100, -(size.Y / 2) / 100); vs[2] = new System.Numerics.Vector2((size.X / 2) / 100, (size.Y / 2) / 100); vs[3] = new System.Numerics.Vector2(-(size.X / 2) / 100, (size.Y / 2) / 100); shape.Set(vs); fd.shape = shape; fd.shape = shape; body.CreateFixture(fd); Bodies.Add(body); return(body); }
public Body CreateStaticTriangle(Vector2 position) { BodyDef bd = new BodyDef(); bd.type = BodyType.Static; bd.position = new System.Numerics.Vector2(position.X / 100, position.Y / 100); bd.fixedRotation = false; bd.gravityScale = 1.000000000000000e+00f; var body = b2DWorld.CreateBody(bd); FixtureDef fd = new FixtureDef(); fd.friction = 2.000000029802322e-01f; fd.restitution = 2.000000029802322e-01f; fd.density = 1.000000000000000e+00f; fd.isSensor = false; PolygonShape shape = new PolygonShape(); System.Numerics.Vector2[] vs = new System.Numerics.Vector2[3]; vs[0] = new System.Numerics.Vector2(0, -(33f / 2f) / 100f); vs[1] = new System.Numerics.Vector2(-(33f / 2f) / 100f, (33f / 2f) / 100f); vs[2] = new System.Numerics.Vector2((33f / 2f) / 100f, (33f / 2f) / 100f); shape.Set(vs); fd.shape = shape; fd.shape = shape; body.CreateFixture(fd); Bodies.Add(body); return(body); }
public ApplyForce() { World.Gravity = new Vector2(0.0f, 0.0f); const float restitution = 0.4f; Body ground; { var bd = new BodyDef(); bd.Position.Set(0.0f, 20.0f); ground = World.CreateBody(bd); var shape = new EdgeShape(); var sd = new FixtureDef(); sd.Shape = shape; sd.Density = 0.0f; sd.Restitution = restitution; // Left vertical shape.Set(new Vector2(-20.0f, -20.0f), new Vector2(-20.0f, 20.0f)); ground.CreateFixture(sd); // Right vertical shape.Set(new Vector2(20.0f, -20.0f), new Vector2(20.0f, 20.0f)); ground.CreateFixture(sd); // Top horizontal shape.Set(new Vector2(-20.0f, 20.0f), new Vector2(20.0f, 20.0f)); ground.CreateFixture(sd); // Bottom horizontal shape.Set(new Vector2(-20.0f, -20.0f), new Vector2(20.0f, -20.0f)); ground.CreateFixture(sd); } { var xf1 = new Transform(); xf1.Rotation.Set(0.3524f * Settings.Pi); xf1.Position = xf1.Rotation.GetXAxis(); var vertices = new Vector2[3]; vertices[0] = MathUtils.Mul(xf1, new Vector2(-1.0f, 0.0f)); vertices[1] = MathUtils.Mul(xf1, new Vector2(1.0f, 0.0f)); vertices[2] = MathUtils.Mul(xf1, new Vector2(0.0f, 0.5f)); var poly1 = new PolygonShape(); poly1.Set(vertices); var sd1 = new FixtureDef(); sd1.Shape = poly1; sd1.Density = 2.0f; var xf2 = new Transform(); xf2.Rotation.Set(-0.3524f * Settings.Pi); xf2.Position = -xf2.Rotation.GetXAxis(); vertices[0] = MathUtils.Mul(xf2, new Vector2(-1.0f, 0.0f)); vertices[1] = MathUtils.Mul(xf2, new Vector2(1.0f, 0.0f)); vertices[2] = MathUtils.Mul(xf2, new Vector2(0.0f, 0.5f)); var poly2 = new PolygonShape(); poly2.Set(vertices); var sd2 = new FixtureDef(); sd2.Shape = poly2; sd2.Density = 2.0f; var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position = new Vector2(0.0f, 3.0f); bd.Angle = Settings.Pi; bd.AllowSleep = false; _body = World.CreateBody(bd); _body.CreateFixture(sd1); _body.CreateFixture(sd2); var gravity = 10.0f; var I = _body.Inertia; var mass = _body.Mass; // Compute an effective radius that can be used to // set the max torque for a friction joint // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m) var radius = (float)Math.Sqrt(2.0f * I / mass); FrictionJointDef jd = new FrictionJointDef(); jd.BodyA = ground; jd.BodyB = _body; jd.LocalAnchorA.SetZero(); jd.LocalAnchorB = _body.GetLocalCenter(); jd.CollideConnected = true; jd.MaxForce = 0.5f * mass * gravity; jd.MaxTorque = 0.2f * mass * radius * gravity; World.CreateJoint(jd); } { var shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.5f); var fd = new FixtureDef(); fd.Shape = shape; fd.Density = 1.0f; fd.Friction = 0.3f; for (var i = 0; i < 10; ++i) { var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(0.0f, 7.0f + 1.54f * i); var body = World.CreateBody(bd); body.CreateFixture(fd); var gravity = 10.0f; var I = body.Inertia; var mass = body.Mass; // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m) var radius = (float)Math.Sqrt(2.0f * I / mass); var jd = new FrictionJointDef(); jd.LocalAnchorA.SetZero(); jd.LocalAnchorB.SetZero(); jd.BodyA = ground; jd.BodyB = body; jd.CollideConnected = true; jd.MaxForce = mass * gravity; jd.MaxTorque = 0.1f * mass * radius * gravity; World.CreateJoint(jd); } } }
public Bridge() { Body ground; { var bd = new BodyDef(); ground = World.CreateBody(bd); var shape = new EdgeShape(); shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { var shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.125f); var fd = new FixtureDef(); fd.Shape = shape; fd.Density = 20.0f; fd.Friction = 0.2f; var jd = new RevoluteJointDef(); var prevBody = ground; for (var i = 0; i < Count; ++i) { var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(-14.5f + 1.0f * i, 5.0f); var body = World.CreateBody(bd); body.CreateFixture(fd); var anchor = new Vector2(-15.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); World.CreateJoint(jd); if (i == Count >> 1) { _middle = body; } prevBody = body; } { var anchor = new Vector2(-15.0f + 1.0f * Count, 5.0f); jd.Initialize(prevBody, ground, anchor); World.CreateJoint(jd); } } for (var i = 0; i < 2; ++i) { var vertices = new Vector2[3]; vertices[0].Set(-0.5f, 0.0f); vertices[1].Set(0.5f, 0.0f); vertices[2].Set(0.0f, 1.5f); var shape = new PolygonShape(); shape.Set(vertices); var fd = new FixtureDef(); fd.Shape = shape; fd.Density = 1.0f; var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(-8.0f + 8.0f * i, 12.0f); var body = World.CreateBody(bd); body.CreateFixture(fd); } for (var i = 0; i < 3; ++i) { var shape = new CircleShape(); shape.Radius = 0.5f; var fd = new FixtureDef(); fd.Shape = shape; fd.Density = 1.0f; var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(-6.0f + 6.0f * i, 10.0f); var body = World.CreateBody(bd); body.CreateFixture(fd); } }
public DumpLoader() { //Source code dump of Box2D scene: issue304-minimal-case.rube // // Created by R.U.B.E 1.3.0 // Using Box2D version 2.3.0 // Wed April 3 2013 04:33:28 // // This code is originally intended for use in the Box2D testbed, // but you can easily use it in other applications by providing // a World for use as the 'World' variable in the code below. Vector2 g = new Vector2(0.000000000000000e+00f, -1.000000000000000e+01f); World.Gravity = g; Body[] bodies = new Body[3]; Joint[] joints = new Joint[0]; { BodyDef bd = new BodyDef(); bd.BodyType = (BodyType)0; bd.Position.Set(2.587699890136719e-02f, 5.515012264251709e+00f); bd.Angle = 0.000000000000000e+00f; bd.LinearVelocity.Set(0.000000000000000e+00f, 0.000000000000000e+00f); bd.AngularVelocity = 0.000000000000000e+00f; bd.LinearDamping = 0.000000000000000e+00f; bd.AngularDamping = 0.000000000000000e+00f; bd.AllowSleep = true; bd.Awake = true; bd.FixedRotation = false; bd.Bullet = false; bd.Enabled = true; bd.GravityScale = 1.000000000000000e+00f; bodies[0] = World.CreateBody(bd); { FixtureDef fd = new FixtureDef(); fd.Friction = 2.000000029802322e-01f; fd.Restitution = 0.000000000000000e+00f; fd.Density = 1.000000000000000e+00f; fd.IsSensor = false; fd.Filter.CategoryBits = (1); fd.Filter.MaskBits = (65535); fd.Filter.GroupIndex = (0); PolygonShape shape = new PolygonShape(); Vector2[] vs = new Vector2[8]; vs[0].Set(7.733039855957031e-01f, -1.497260034084320e-01f); vs[1].Set(-4.487270116806030e-01f, 1.138330027461052e-01f); vs[2].Set(-1.880589962005615e+00f, -1.365900039672852e-01f); vs[3].Set(3.972740173339844e-01f, -3.897832870483398e+00f); shape.Set(vs, 4); fd.Shape = shape; bodies[0].CreateFixture(fd); } } { BodyDef bd = new BodyDef(); bd.BodyType = (BodyType)(2); bd.Position.Set(-3.122138977050781e-02f, 7.535382270812988e+00f); bd.Angle = -1.313644275069237e-02f; bd.LinearVelocity.Set(8.230687379837036e-01f, 7.775862514972687e-02f); bd.AngularVelocity = 3.705333173274994e-02f; bd.LinearDamping = 0.000000000000000e+00f; bd.AngularDamping = 0.000000000000000e+00f; bd.AllowSleep = true; bd.Awake = true; bd.FixedRotation = false; bd.Bullet = false; bd.Enabled = true; bd.GravityScale = 1.000000000000000e+00f; bodies[1] = World.CreateBody(bd); { FixtureDef fd = new FixtureDef(); fd.Friction = 5.000000000000000e-01f; fd.Restitution = 0.000000000000000e+00f; fd.Density = 5.000000000000000e+00f; fd.IsSensor = false; fd.Filter.CategoryBits = (1); fd.Filter.MaskBits = (65535); fd.Filter.GroupIndex = (0); PolygonShape shape = new PolygonShape(); Vector2[] vs = new Vector2[8]; vs[0].Set(3.473900079727173e+00f, -2.009889930486679e-01f); vs[1].Set(3.457079887390137e+00f, 3.694039955735207e-02f); vs[2].Set(-3.116359949111938e+00f, 2.348500071093440e-03f); vs[3].Set(-3.109960079193115e+00f, -3.581250011920929e-01f); vs[4].Set(-2.590820074081421e+00f, -5.472509860992432e-01f); vs[5].Set(2.819370031356812e+00f, -5.402340292930603e-01f); shape.Set(vs, 6); fd.Shape = shape; bodies[1].CreateFixture(fd); } } { BodyDef bd = new BodyDef(); bd.BodyType = (BodyType)(2); bd.Position.Set(-7.438077926635742e-01f, 6.626811981201172e+00f); bd.Angle = -1.884713363647461e+01f; bd.LinearVelocity.Set(1.785794943571091e-01f, 3.799796104431152e-07f); bd.AngularVelocity = -5.908820639888290e-06f; bd.LinearDamping = 0.000000000000000e+00f; bd.AngularDamping = 0.000000000000000e+00f; bd.AllowSleep = true; bd.Awake = true; bd.FixedRotation = false; bd.Bullet = false; bd.Enabled = true; bd.GravityScale = 1.000000000000000e+00f; bodies[2] = World.CreateBody(bd); { FixtureDef fd = new FixtureDef(); fd.Friction = 9.499999880790710e-01f; fd.Restitution = 0.000000000000000e+00f; fd.Density = 1.000000000000000e+01f; fd.IsSensor = false; fd.Filter.CategoryBits = (1); fd.Filter.MaskBits = (65535); fd.Filter.GroupIndex = (-3); PolygonShape shape = new PolygonShape(); Vector2[] vs = new Vector2[8]; vs[0].Set(1.639146506786346e-01f, 4.428443685173988e-02f); vs[1].Set(-1.639146655797958e-01f, 4.428443685173988e-02f); vs[2].Set(-1.639146655797958e-01f, -4.428443312644958e-02f); vs[3].Set(1.639146357774734e-01f, -4.428444057703018e-02f); shape.Set(vs, 4); fd.Shape = shape; bodies[2].CreateFixture(fd); } } joints = null; bodies = null; }
public CharacterCollision() { // Ground body { var bd = new BodyDef(); var ground = World.CreateBody(bd); var shape = new EdgeShape(); shape.Set(new Vector2(-20.0f, 0.0f), new Vector2(20.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } // Collinear edges with no adjacency information. // This shows the problematic case where a box shape can hit // an internal vertex. { var bd = new BodyDef(); var ground = World.CreateBody(bd); var shape = new EdgeShape(); shape.Set(new Vector2(-8.0f, 1.0f), new Vector2(-6.0f, 1.0f)); ground.CreateFixture(shape, 0.0f); shape.Set(new Vector2(-6.0f, 1.0f), new Vector2(-4.0f, 1.0f)); ground.CreateFixture(shape, 0.0f); shape.Set(new Vector2(-4.0f, 1.0f), new Vector2(-2.0f, 1.0f)); ground.CreateFixture(shape, 0.0f); } // Chain shape { var bd = new BodyDef { Angle = 0.25f * Settings.Pi }; var ground = World.CreateBody(bd); var vs = new Vector2[4] { new Vector2(5.0f, 7.0f), new Vector2(6.0f, 8.0f), new Vector2(7.0f, 8.0f), new Vector2(8.0f, 7.0f) }; var shape = new ChainShape(); shape.CreateChain(vs); ground.CreateFixture(shape, 0.0f); } // Square tiles. This shows that adjacency shapes may // have non-smooth collision. There is no solution // to this problem. { var bd = new BodyDef(); var ground = World.CreateBody(bd); var shape = new PolygonShape(); shape.SetAsBox(1.0f, 1.0f, new Vector2(4.0f, 3.0f), 0.0f); ground.CreateFixture(shape, 0.0f); shape.SetAsBox(1.0f, 1.0f, new Vector2(6.0f, 3.0f), 0.0f); ground.CreateFixture(shape, 0.0f); shape.SetAsBox(1.0f, 1.0f, new Vector2(8.0f, 3.0f), 0.0f); ground.CreateFixture(shape, 0.0f); } // Square made from an edge loop. Collision should be smooth. { var bd = new BodyDef(); var ground = World.CreateBody(bd); var vs = new Vector2[4] { new Vector2(-1.0f, 3.0f), new Vector2(1.0f, 3.0f), new Vector2(1.0f, 5.0f), new Vector2(-1.0f, 5.0f) }; var shape = new ChainShape(); shape.CreateLoop(vs); ground.CreateFixture(shape, 0.0f); } // Edge loop. Collision should be smooth. { var bd = new BodyDef { Position = new Vector2(-10.0f, 4.0f) }; var ground = World.CreateBody(bd); var vs = new Vector2[10] { new Vector2(0.0f, 0.0f), new Vector2(6.0f, 0.0f), new Vector2(6.0f, 2.0f), new Vector2(4.0f, 1.0f), new Vector2(2.0f, 2.0f), new Vector2(0.0f, 2.0f), new Vector2(-2.0f, 2.0f), new Vector2(-4.0f, 3.0f), new Vector2(-6.0f, 2.0f), new Vector2(-6.0f, 0.0f) }; var shape = new ChainShape(); shape.CreateLoop(vs); ground.CreateFixture(shape, 0.0f); } // Square character 1 { var bd = new BodyDef { Position = new Vector2(-3.0f, 8.0f), BodyType = BodyType.DynamicBody, FixedRotation = true, AllowSleep = false }; var body = World.CreateBody(bd); var shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.5f); var fd = new FixtureDef { Shape = shape, Density = 20.0f }; body.CreateFixture(fd); } // Square character 2 { var bd = new BodyDef { Position = new Vector2(-5.0f, 5.0f), BodyType = BodyType.DynamicBody, FixedRotation = true, AllowSleep = false }; var body = World.CreateBody(bd); var shape = new PolygonShape(); shape.SetAsBox(0.25f, 0.25f); var fd = new FixtureDef { Shape = shape, Density = 20.0f }; body.CreateFixture(fd); } // Hexagon character { var bd = new BodyDef { Position = new Vector2(-5.0f, 8.0f), BodyType = BodyType.DynamicBody, FixedRotation = true, AllowSleep = false }; var body = World.CreateBody(bd); var angle = 0.0f; const float delta = Settings.Pi / 3.0f; var vertices = new Vector2[6]; for (var i = 0; i < 6; ++i) { vertices[i].Set(0.5f * (float)Math.Cos(angle), 0.5f * (float)Math.Sin(angle)); angle += delta; } var shape = new PolygonShape(); shape.Set(vertices); var fd = new FixtureDef { Shape = shape, Density = 20.0f }; body.CreateFixture(fd); } // Circle character { var bd = new BodyDef { Position = new Vector2(3.0f, 5.0f), BodyType = BodyType.DynamicBody, FixedRotation = true, AllowSleep = false }; var body = World.CreateBody(bd); var shape = new CircleShape { Radius = 0.5f }; var fd = new FixtureDef { Shape = shape, Density = 20.0f }; body.CreateFixture(fd); } // Circle character { var bd = new BodyDef { Position = new Vector2(-7.0f, 6.0f), BodyType = BodyType.DynamicBody, AllowSleep = false }; _character = World.CreateBody(bd); var shape = new CircleShape { Radius = 0.25f }; var fd = new FixtureDef { Shape = shape, Density = 20.0f, Friction = 1.0f }; _character.CreateFixture(fd); } }
private CCDTest() { { Body body = BodyFactory.CreateBody(World); body.Position = new Vector2(0.0f, -0.2f); Vertices box = PolygonTools.CreateRectangle(10, 0.2f); PolygonShape shape = new PolygonShape(box, 0); body.CreateFixture(shape); box = PolygonTools.CreateRectangle(0.2f, 1.0f, new Vector2(0.5f, 1.2f), 0.0f); shape.Set(box); body.CreateFixture(shape); } { Vertices box = PolygonTools.CreateRectangle(2, 0.1f); PolygonShape shape = new PolygonShape(box, 1); _angularVelocity = Rand.RandomFloat(-50.0f, 50.0f); _angularVelocity = -30.669577f; Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(0.0f, 20.0f); Fixture fixture = body.CreateFixture(shape); fixture.Restitution = 0.0f; body.LinearVelocity = new Vector2(0.0f, -100.0f); body.AngularVelocity = _angularVelocity; } #if false { FixtureDef fd = new FixtureDef(); fd.SetAsBox(10.0f, 0.1f); fd.density = 0.0f; bd.BodyType = BodyDef.e_static; bd.position = new Vector2(0.0f, -0.2f); Body ground = _world.CreateBody(); ground.CreateFixture(fd); } { FixtureDef fd = new FixtureDef(); fd.SetAsBox(2.0f, 0.1f); fd.density = 1.0f; fd.restitution = 0.0f; BodyDef bd1; bd1.type = BodyDef.e_dynamic; bd1.bullet = true; bd1.allowSleep = false; bd1.position = new Vector2(0.0f, 20.0f); Body b1 = _world.Create(bd1); b1.CreateFixture(fd); b1.SetLinearVelocity(new Vector2(0.0f, -100.0f)); fd.SetAsBox(1.0f, 0.1f); BodyDef bd2; bd2.type = BodyDef.e_dynamic; bd2.bullet = true; bd2.allowSleep = false; bd2.position = new Vector2(0.0f, 20.2f); Body b2 = _world.Create(bd2); b2.CreateFixture(fd); b2.SetLinearVelocity(new Vector2(0.0f, -100.0f)); fd.SetAsBox(0.25f, 0.25f); fd.density = 10.0f; BodyDef bd3; bd3.type = BodyDef.e_dynamic; bd3.bullet = true; bd3.allowSleep = false; bd3.position = new Vector2(0.0f, 100.0f); Body b3 = _world.Create(bd3); b3.CreateFixture(fd); b3.SetLinearVelocity(new Vector2(0.0f, -150.0f)); } #elif false float k_restitution = 1.4f; { bd.position = new Vector2(0.0f, 20.0f); Body body = _world.CreateBody(); FixtureDef fd = new FixtureDef(); fd.density = 0.0f; fd.restitution = k_restitution; fd.SetAsBox(0.1f, 10.0f, new Vector2(-10.0f, 0.0f), 0.0f); body.CreateFixture(fd); fd.SetAsBox(0.1f, 10.0f, new Vector2(10.0f, 0.0f), 0.0f); body.CreateFixture(fd); fd.SetAsBox(0.1f, 10.0f, new Vector2(0.0f, -10.0f), 0.5f * FarseerPhysics.Settings.b2_pi); body.CreateFixture(fd); fd.SetAsBox(0.1f, 10.0f, new Vector2(0.0f, 10.0f), -0.5f * FarseerPhysics.Settings.b2_pi); body.CreateFixture(fd); } #if false { FixtureDef sd_bottom; sd_bottom.SetAsBox(1.0f, 0.1f, new Vector2(0.0f, -1.0f), 0.0f); sd_bottom.density = 4.0f; FixtureDef sd_top; sd_top.SetAsBox(1.0f, 0.1f, new Vector2(0.0f, 1.0f), 0.0f); sd_top.density = 4.0f; FixtureDef sd_left; sd_left.SetAsBox(0.1f, 1.0f, new Vector2(-1.0f, 0.0f), 0.0f); sd_left.density = 4.0f; FixtureDef sd_right; sd_right.SetAsBox(0.1f, 1.0f, new Vector2(1.0f, 0.0f), 0.0f); sd_right.density = 4.0f; bd.BodyType = BodyDef.e_dynamicBody; bd.position = new Vector2(0.0f, 15.0f); Body body = _world.CreateBody(); body.CreateFixture(&sd_bottom); body.CreateFixture(&sd_top); body.CreateFixture(&sd_left); body.CreateFixture(&sd_right); } #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, new Vector2(-1.45f, 2.35f), 0.2f); sd_left.density = 4.0f; FixtureDef sd_right; sd_right.SetAsBox(0.15f, 2.7f, new Vector2(1.45f, 2.35f), -0.2f); sd_right.density = 4.0f; bd.position = new Vector2(0.0f, 15.0f); Body body = _world.CreateBody(); body.CreateFixture(&sd_bottom); body.CreateFixture(&sd_left); body.CreateFixture(&sd_right); } #else { bd.position = new Vector2(-5.0f, 20.0f); bd.bullet = true; Body body = _world.CreateBody(); body.SetAngularVelocity(Rand.RandomFloat(-50.0f, 50.0f)); FixtureDef fd = new FixtureDef(); fd.SetAsBox(0.1f, 4.0f); fd.density = 1.0f; fd.restitution = 0.0f; body.CreateFixture(fd); } #endif for (int i = 0; i < 0; ++i) { bd.position = new Vector2(0.0f, 15.0f + i); bd.bullet = true; Body body = _world.CreateBody(); body.SetAngularVelocity(Rand.RandomFloat(-50.0f, 50.0f)); FixtureDef fd = new FixtureDef(); fd.radius = 0.25f; fd.density = 1.0f; fd.restitution = 0.0f; body.CreateFixture(fd); } #endif }
public CompoundShapes() { { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 0.0f); Body body = World.CreateBody(bd); EdgeShape shape = new EdgeShape(); shape.SetTwoSided(new Vector2(50.0f, 0.0f), new Vector2(-50.0f, 0.0f)); body.CreateFixture(shape, 0.0f); } // Table 1 { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(-15.0f, 1.0f); m_table1 = World.CreateBody(bd); PolygonShape top = new PolygonShape(); top.SetAsBox(3.0f, 0.5f, new Vector2(0.0f, 3.5f), 0.0f); PolygonShape leftLeg = new PolygonShape(); leftLeg.SetAsBox(0.5f, 1.5f, new Vector2(-2.5f, 1.5f), 0.0f); PolygonShape rightLeg = new PolygonShape(); rightLeg.SetAsBox(0.5f, 1.5f, new Vector2(2.5f, 1.5f), 0.0f); m_table1.CreateFixture(top, 2.0f); m_table1.CreateFixture(leftLeg, 2.0f); m_table1.CreateFixture(rightLeg, 2.0f); } // Table 2 { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(-5.0f, 1.0f); m_table2 = World.CreateBody(bd); PolygonShape top = new PolygonShape(); top.SetAsBox(3.0f, 0.5f, new Vector2(0.0f, 3.5f), 0.0f); PolygonShape leftLeg = new PolygonShape(); leftLeg.SetAsBox(0.5f, 2.0f, new Vector2(-2.5f, 2.0f), 0.0f); PolygonShape rightLeg = new PolygonShape(); rightLeg.SetAsBox(0.5f, 2.0f, new Vector2(2.5f, 2.0f), 0.0f); m_table2.CreateFixture(top, 2.0f); m_table2.CreateFixture(leftLeg, 2.0f); m_table2.CreateFixture(rightLeg, 2.0f); } // Spaceship 1 { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(5.0f, 1.0f); m_ship1 = World.CreateBody(bd); Vector2[] vertices = new Vector2[3]; PolygonShape left = new PolygonShape(); vertices[0].Set(-2.0f, 0.0f); vertices[1].Set(0.0f, 4.0f / 3.0f); vertices[2].Set(0.0f, 4.0f); left.Set(vertices, 3); PolygonShape right = new PolygonShape(); vertices[0].Set(2.0f, 0.0f); vertices[1].Set(0.0f, 4.0f / 3.0f); vertices[2].Set(0.0f, 4.0f); right.Set(vertices, 3); m_ship1.CreateFixture(left, 2.0f); m_ship1.CreateFixture(right, 2.0f); } // Spaceship 2 { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(15.0f, 1.0f); m_ship2 = World.CreateBody(bd); Vector2[] vertices = new Vector2[3]; PolygonShape left = new PolygonShape(); vertices[0].Set(-2.0f, 0.0f); vertices[1].Set(1.0f, 2.0f); vertices[2].Set(0.0f, 4.0f); left.Set(vertices, 3); PolygonShape right = new PolygonShape(); vertices[0].Set(2.0f, 0.0f); vertices[1].Set(-1.0f, 2.0f); vertices[2].Set(0.0f, 4.0f); right.Set(vertices, 3); m_ship2.CreateFixture(left, 2.0f); m_ship2.CreateFixture(right, 2.0f); } }
void CreateLeg(float s, Vector2 wheelAnchor) { Vector2 p1 = new Vector2(5.4f * s, -6.1f); Vector2 p2 = new Vector2(7.2f * s, -1.2f); Vector2 p3 = new Vector2(4.3f * s, -1.9f); Vector2 p4 = new Vector2(3.1f * s, 0.8f); Vector2 p5 = new Vector2(6.0f * s, 1.5f); Vector2 p6 = new Vector2(2.5f * s, 3.7f); FixtureDef fd1 = new FixtureDef(); FixtureDef fd2 = new FixtureDef(); fd1.filter.groupIndex = -1; fd2.filter.groupIndex = -1; fd1.density = 1.0f; fd2.density = 1.0f; PolygonShape poly1 = new PolygonShape(); PolygonShape poly2 = new PolygonShape(); Vector2[] vertices = new Vector2[3]; if (s > 0.0f) { vertices[0] = p1; vertices[1] = p2; vertices[2] = p3; poly1.Set(vertices, 3); vertices[0] = Vector2.Zero; vertices[1] = p5 - p4; vertices[2] = p6 - p4; poly2.Set(vertices, 3); } else { vertices[0] = p1; vertices[1] = p3; vertices[2] = p2; poly1.Set(vertices, 3); vertices[0] = Vector2.Zero; vertices[1] = p6 - p4; vertices[2] = p5 - p4; poly2.Set(vertices, 3); } fd1.shape = poly1; fd2.shape = poly2; BodyDef bd1 = new BodyDef(); BodyDef bd2 = new BodyDef(); bd1.type = BodyType.Dynamic; bd2.type = BodyType.Dynamic; bd1.position = _offset; bd2.position = p4 + _offset; bd1.angularDamping = 10.0f; bd2.angularDamping = 10.0f; Body body1 = _world.CreateBody(bd1); Body body2 = _world.CreateBody(bd2); body1.CreateFixture(fd1); body2.CreateFixture(fd2); DistanceJointDef djd = new DistanceJointDef(); // Using a soft distanceraint 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 + _offset, p5 + _offset); _world.CreateJoint(djd); djd.Initialize(body1, body2, p3 + _offset, p4 + _offset); _world.CreateJoint(djd); djd.Initialize(body1, _wheel, p3 + _offset, wheelAnchor + _offset); _world.CreateJoint(djd); djd.Initialize(body2, _wheel, p6 + _offset, wheelAnchor + _offset); _world.CreateJoint(djd); RevoluteJointDef rjd = new RevoluteJointDef(); rjd.Initialize(body2, _chassis, p4 + _offset); _world.CreateJoint(rjd); }
public ApplyForce() { _world.Gravity = new Vector2(0.0, 0.0); const double k_restitution = 0.4; Body ground; { BodyDef bd = new BodyDef(); bd.position = new Vector2(0.0f, 20.0f); ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); FixtureDef sd = new FixtureDef(); sd.shape = shape; sd.density = 0.0f; sd.restitution = k_restitution; // Left vertical shape.SetAsEdge(new Vector2(-20.0f, -20.0f), new Vector2(-20.0f, 20.0f)); ground.CreateFixture(sd); // Right vertical shape.SetAsEdge(new Vector2(20.0f, -20.0f), new Vector2(20.0f, 20.0f)); ground.CreateFixture(sd); // Top horizontal shape.SetAsEdge(new Vector2(-20.0f, 20.0f), new Vector2(20.0f, 20.0f)); ground.CreateFixture(sd); // Bottom horizontal shape.SetAsEdge(new Vector2(-20.0f, -20.0f), new Vector2(20.0f, -20.0f)); ground.CreateFixture(sd); } { Alt.Box2D.Transform xf1 = new Alt.Box2D.Transform(); xf1.R.Set(0.3524 * Alt.Box2D.Settings.b2_pi); xf1.Position = MathUtils.Multiply(ref xf1.R, new Vector2(1.0f, 0.0f)); Vector2[] vertices = new Vector2[3]; vertices[0] = MathUtils.Multiply(ref xf1, new Vector2(-1.0f, 0.0f)); vertices[1] = MathUtils.Multiply(ref xf1, new Vector2(1.0f, 0.0f)); vertices[2] = MathUtils.Multiply(ref xf1, new Vector2(0.0f, 0.5f)); PolygonShape poly1 = new PolygonShape(); poly1.Set(vertices, 3); FixtureDef sd1 = new FixtureDef(); sd1.shape = poly1; sd1.density = 4.0f; Alt.Box2D.Transform xf2 = new Alt.Box2D.Transform(); xf2.R.Set(-0.3524 * Alt.Box2D.Settings.b2_pi); xf2.Position = MathUtils.Multiply(ref xf2.R, new Vector2(-1.0f, 0.0f)); vertices[0] = MathUtils.Multiply(ref xf2, new Vector2(-1.0f, 0.0f)); vertices[1] = MathUtils.Multiply(ref xf2, new Vector2(1.0f, 0.0f)); vertices[2] = MathUtils.Multiply(ref xf2, new Vector2(0.0f, 0.5f)); PolygonShape poly2 = new PolygonShape(); poly2.Set(vertices, 3); FixtureDef sd2 = new FixtureDef(); sd2.shape = poly2; sd2.density = 2.0f; BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.angularDamping = 5.0f; bd.linearDamping = 0.1f; bd.position = new Vector2(0.0f, 2.0f); bd.angle = Alt.Box2D.Settings.b2_pi; bd.allowSleep = false; _body = _world.CreateBody(bd); _body.CreateFixture(sd1); _body.CreateFixture(sd2); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.5f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 1.0f; fd.friction = 0.3f; for (int i = 0; i < 10; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.0f, 5.0f + 1.54f * i); Body body = _world.CreateBody(bd); body.CreateFixture(fd); double gravity = 10.0f; double I = body.GetInertia(); double mass = body.GetMass(); // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m) double radius = (double)Math.Sqrt(2.0 * (double)(I / mass)); FrictionJointDef jd = new FrictionJointDef(); jd.localAnchorA = Vector2.Zero; jd.localAnchorB = Vector2.Zero; jd.bodyA = ground; jd.bodyB = body; jd.collideConnected = true; jd.maxForce = mass * gravity; jd.maxTorque = mass * radius * gravity; _world.CreateJoint(jd); } } }
public CollisionFiltering() { // Ground body { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(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 Vector2[] vertices = new Vector2[3]; vertices[0] = new Vector2(-1.0f, 0.0f); vertices[1] = new Vector2(1.0f, 0.0f); vertices[2] = new Vector2(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 = new Vector2(-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 = new Vector2(-5.0f, 6.0f); triangleBodyDef.fixedRotation = true; // look at me! Body body2 = _world.CreateBody(triangleBodyDef); body2.CreateFixture(triangleShapeDef); { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-5.0f, 10.0f); Body body = _world.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 = new Vector2(0.0f, 4.0f); jd.localAnchorB = Vector2.Zero; jd.localAxis1 = new Vector2(0.0f, 1.0f); jd.lowerTranslation = -1.0f; jd.upperTranslation = 1.0f; _world.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 = new Vector2(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 = new Vector2(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.type = BodyType.Dynamic; circleBodyDef.position = new Vector2(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 = new Vector2(5.0f, 6.0f); Body body6 = _world.CreateBody(circleBodyDef); body6.CreateFixture(circleShapeDef); }
public CompoundShapes() { { BodyDef bd = new BodyDef(); bd.position = new Vector2(0.0f, 0.0f); Body body = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(50.0f, 0.0f), new Vector2(-50.0f, 0.0f)); body.CreateFixture(shape, 0.0f); } { CircleShape circle1 = new CircleShape(); circle1._radius = 0.5f; circle1._p = new Vector2(-0.5f, 0.5f); CircleShape circle2 = new CircleShape(); circle2._radius = 0.5f; circle2._p = new Vector2(0.5f, 0.5f); for (int i = 0; i < 10; ++i) { float x = Rand.RandomFloat(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(x + 5.0f, 1.05f + 2.5f * i); bd.angle = Rand.RandomFloat(-(float)Settings.b2_pi, (float)Settings.b2_pi); Body body = _world.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 Vector2(0.0f, -0.5f), 0.5f * (float)Settings.b2_pi); for (int i = 0; i < 10; ++i) { float x = Rand.RandomFloat(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(x - 5.0f, 1.05f + 2.5f * i); bd.angle = Rand.RandomFloat(-(float)Settings.b2_pi, (float)Settings.b2_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 * (float)Settings.b2_pi); xf1.Position = MathUtils.Multiply(ref xf1.R, new Vector2(1.0f, 0.0f)); Vector2[] vertices = new Vector2[3]; PolygonShape triangle1 = new PolygonShape(); vertices[0] = MathUtils.Multiply(ref xf1, new Vector2(-1.0f, 0.0f)); vertices[1] = MathUtils.Multiply(ref xf1, new Vector2(1.0f, 0.0f)); vertices[2] = MathUtils.Multiply(ref xf1, new Vector2(0.0f, 0.5f)); triangle1.Set(vertices, 3); Transform xf2 = new Transform(); xf2.R.Set(-0.3524f * (float)Settings.b2_pi); xf2.Position = MathUtils.Multiply(ref xf2.R, new Vector2(-1.0f, 0.0f)); PolygonShape triangle2 = new PolygonShape(); vertices[0] = MathUtils.Multiply(ref xf2, new Vector2(-1.0f, 0.0f)); vertices[1] = MathUtils.Multiply(ref xf2, new Vector2(1.0f, 0.0f)); vertices[2] = MathUtils.Multiply(ref xf2, new Vector2(0.0f, 0.5f)); triangle2.Set(vertices, 3); for (int i = 0; i < 10; ++i) { float x = Rand.RandomFloat(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(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 Vector2(-1.45f, 2.35f), 0.2f); PolygonShape right = new PolygonShape(); right.SetAsBox(0.15f, 2.7f, new Vector2(1.45f, 2.35f), -0.2f); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2( 0.0f, 2.0f ); Body body = _world.CreateBody(bd); body.CreateFixture(bottom, 4.0f); body.CreateFixture(left, 4.0f); body.CreateFixture(right, 4.0f); } }
public ApplyForce() { _world.Gravity = new Vector2(0.0f, 0.0f); const float k_restitution = 0.4f; Body ground; { BodyDef bd = new BodyDef(); bd.position = new Vector2(0.0f, 20.0f); ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); FixtureDef sd = new FixtureDef(); sd.shape = shape; sd.density = 0.0f; sd.restitution = k_restitution; // Left vertical shape.SetAsEdge(new Vector2(-20.0f, -20.0f), new Vector2(-20.0f, 20.0f)); ground.CreateFixture(sd); // Right vertical shape.SetAsEdge(new Vector2(20.0f, -20.0f), new Vector2(20.0f, 20.0f)); ground.CreateFixture(sd); // Top horizontal shape.SetAsEdge(new Vector2(-20.0f, 20.0f), new Vector2(20.0f, 20.0f)); ground.CreateFixture(sd); // Bottom horizontal shape.SetAsEdge(new Vector2(-20.0f, -20.0f), new Vector2(20.0f, -20.0f)); ground.CreateFixture(sd); } { Transform xf1 = new Transform(); xf1.R.Set(0.3524f * (float)Settings.b2_pi); xf1.Position = MathUtils.Multiply(ref xf1.R, new Vector2(1.0f, 0.0f)); Vector2[] vertices = new Vector2[3]; vertices[0] = MathUtils.Multiply(ref xf1, new Vector2(-1.0f, 0.0f)); vertices[1] = MathUtils.Multiply(ref xf1, new Vector2(1.0f, 0.0f)); vertices[2] = MathUtils.Multiply(ref xf1, new Vector2(0.0f, 0.5f)); PolygonShape poly1 = new PolygonShape(); poly1.Set(vertices, 3); FixtureDef sd1 = new FixtureDef(); sd1.shape = poly1; sd1.density = 4.0f; Transform xf2 = new Transform(); xf2.R.Set(-0.3524f * (float)Settings.b2_pi); xf2.Position = MathUtils.Multiply(ref xf2.R, new Vector2(-1.0f, 0.0f)); vertices[0] = MathUtils.Multiply(ref xf2, new Vector2(-1.0f, 0.0f)); vertices[1] = MathUtils.Multiply(ref xf2, new Vector2(1.0f, 0.0f)); vertices[2] = MathUtils.Multiply(ref xf2, new Vector2(0.0f, 0.5f)); PolygonShape poly2 = new PolygonShape(); poly2.Set(vertices, 3); FixtureDef sd2 = new FixtureDef(); sd2.shape = poly2; sd2.density = 2.0f; BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.angularDamping = 5.0f; bd.linearDamping = 0.1f; bd.position = new Vector2(0.0f, 2.0f); bd.angle = (float)Settings.b2_pi; bd.allowSleep = false; _body = _world.CreateBody(bd); _body.CreateFixture(sd1); _body.CreateFixture(sd2); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.5f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 1.0f; fd.friction = 0.3f; for (int i = 0; i < 10; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.0f, 5.0f + 1.54f * i); Body body = _world.CreateBody(bd); body.CreateFixture(fd); float gravity = 10.0f; float I = body.GetInertia(); float mass = body.GetMass(); // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m) float radius = (float)Math.Sqrt(2.0 * (double)(I / mass)); FrictionJointDef jd = new FrictionJointDef(); jd.localAnchorA = Vector2.Zero; jd.localAnchorB = Vector2.Zero; jd.bodyA = ground; jd.bodyB = body; jd.collideConnected = true; jd.maxForce = mass * gravity; jd.maxTorque = mass * radius * gravity; _world.CreateJoint(jd); } } }
public Bridge() { Body ground = null; { BodyDef bd = new BodyDef(); ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(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; fd.friction = 0.2f; RevoluteJointDef jd = new RevoluteJointDef(); Body prevBody = ground; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-14.5f + 1.0f * i, 5.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); Vector2 anchor = new Vector2(-15.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); _world.CreateJoint(jd); if (i == (e_count >> 1)) { _middle = body; } prevBody = body; } Vector2 anchor2 = new Vector2(-15.0f + 1.0f * e_count, 5.0f); jd.Initialize(prevBody, ground, anchor2); _world.CreateJoint(jd); } Vector2[] vertices = new Vector2[3]; for (int i = 0; i < 2; ++i) { vertices[0] = new Vector2(-0.5f, 0.0f); vertices[1] = new Vector2(0.5f, 0.0f); vertices[2] = new Vector2(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 = new Vector2(-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.type = BodyType.Dynamic; bd.position = new Vector2(-6.0f + 6.0f * i, 10.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); } }
public void createShip1(Vector2 pos, float _rot) { World world = Game1.GameInstance.getWorld(); //////////////// For Sprite System use /////////////// Sprite shipSprite = (Sprite)DisplayManager.Instance().getDisplayObj(SpriteEnum.Ship); Sprite_Proxy proxyShip = new Sprite_Proxy(shipSprite, pos.X, pos.Y, shipScale, Color.Blue); Ship p1 = new Ship(GameObjType.p1ship, proxyShip); SBNode shipBatch = SpriteBatchManager.Instance().getBatch(batchEnum.ships); shipBatch.addDisplayObject(proxyShip); ////////////////////////////////////// // Box2D Body Setup///////////////////////// var shipShape = new PolygonShape(); Vector2[] verts = new Vector2[5]; verts[0] = new Vector2(-5.0f, -5.0f); verts[1] = new Vector2(4.8f, -0.10f); verts[2] = new Vector2(5.0f, 0.00f); verts[3] = new Vector2(4.8f, 0.10f); verts[4] = new Vector2(-5.0f, 5.0f); shipShape.Set(verts, 5); shipShape._centroid = new Vector2(0, 0); var fd = new FixtureDef(); fd.shape = shipShape; fd.restitution = 0.9f; fd.friction = 0.0f; fd.density = 1.0f; fd.userData = p1; BodyDef bd = new BodyDef(); bd.allowSleep = false; bd.fixedRotation = true; bd.type = BodyType.Dynamic; bd.position = p1.spriteRef.pos; var body = world.CreateBody(bd); body.CreateFixture(fd); body.SetUserData(p1); body.Rotation = _rot; /////////////////////////////////////// // Set sprite body reference PhysicsMan.Instance().addPhysicsObj(p1, body); ////////////////// // Set Player's ship and add it to the GameObjManager ////////////// PlayerManager.getPlayer(PlayerID.one).setShip(p1); GameObjManager.Instance().addGameObj(p1); }
void addStuff() { var floorBody = new BodyDef(); floorBody.position = new Vector2(0, 450); var floorShape = new PolygonShape(); floorShape.SetAsBox((float)800, 30); var floorFixture = new FixtureDef(); floorFixture.shape = floorShape; Body worldFloor = physicsWorld.CreateBody(floorBody); worldFloor.CreateFixture(floorFixture); // var squareBody = new BodyDef(); squareBody.type = BodyType.Dynamic; squareBody.position = new Vector2(400, 100); var squareShape = new PolygonShape(); squareShape.SetAsBox(100, 80); var squareFixture = new FixtureDef(); squareFixture.shape = squareShape; squareFixture.density = 1; Body worldSquare = physicsWorld.CreateBody(squareBody); worldSquare.CreateFixture(squareFixture); // int circleSteps = 8; Vector2[] circleList = new Vector2[circleSteps]; var circleRadius = 50; for (int i = 0; i < circleSteps; i++) { circleList[i] = new Vector2((float)(circleRadius * Math.Cos(2 * Math.PI / circleSteps * i)), (float)(circleRadius * Math.Sin(2 * Math.PI / circleSteps * i))); } var circleBody = new BodyDef(); circleBody.type = BodyType.Dynamic; circleBody.position = new Vector2(200, 120); var circleShape = new PolygonShape(); circleShape.Set(circleList, circleSteps); var circleFixture = new FixtureDef(); circleFixture.shape = circleShape; Body worldCircle = physicsWorld.CreateBody(circleBody); worldCircle.CreateFixture(circleFixture); // var triAngleBody = new BodyDef(); triAngleBody.position = new Vector2(600, 80); triAngleBody.type = BodyType.Dynamic; var triAngleShape = new PolygonShape(); Vector2[] triVertices = new Vector2[3]; triVertices[0] = new Vector2(0, 0); triVertices[1] = new Vector2(120, 0); triVertices[2] = new Vector2(120, 120); triAngleShape.Set(triVertices, 3); var triAngleFixture = new FixtureDef(); triAngleFixture.shape = triAngleShape; triAngleFixture.density = 1; Body worldTriAngle = physicsWorld.CreateBody(triAngleBody); worldTriAngle.CreateFixture(triAngleFixture); //var circleBody1 = new BodyDef(); //circleBody1.position = new Vector2(600, 180); //var circleShape1 = new CircleShape(); ////circleShape1._p = new Vector2(600, 180); //circleShape1._radius = 40; //var circleFixture1 = new FixtureDef(); //circleFixture1.shape = circleShape1; //Body worldCircle1 = physicsWorld.CreateBody(circleBody1); //worldCircle1.CreateFixture(circleFixture1); }
public static World CreateWorld() { var gravity = new Vector2(0.000000000000000e+00f, -1.000000000000000e+01f); var world = new World(gravity); var bodies = new Body[2]; { BodyDef bd = new BodyDef(); bd.type = BodyType.Static; bd.position = new Vector2(0.000000000000000e+00f, 0.000000000000000e+00f); bd.angle = 0.000000000000000e+00f; bd.linearVelocity = new Vector2(0.000000000000000e+00f, 0.000000000000000e+00f); bd.angularVelocity = 0.000000000000000e+00f; bd.linearDamping = 0.000000000000000e+00f; bd.angularDamping = 0.000000000000000e+00f; bd.allowSleep = true; bd.awake = true; bd.fixedRotation = false; bd.bullet = false; //bd.active = true; bd.gravityScale = 1.000000000000000e+00f; bodies[0] = world.CreateBody(bd); { FixtureDef fd = new FixtureDef(); fd.friction = 2.000000029802322e-01f; fd.restitution = 2.000000029802322e-01f; fd.density = 1.000000000000000e+00f; fd.isSensor = false; fd.filter.categoryBits = (1); fd.filter.maskBits = (65535); fd.filter.groupIndex = (0); PolygonShape shape = new PolygonShape(); Vector2[] vs = new Vector2[4]; vs[0] = new Vector2(1.622321891784668e+01f, 4.735573291778564e+00f); vs[1] = new Vector2(1.601119422912598e+01f, 4.735989570617676e+00f); vs[2] = new Vector2(1.602764320373535e+01f, 3.814474105834961e+00f); vs[3] = new Vector2(1.621816253662109e+01f, 3.825283050537109e+00f); shape.Set(vs); fd.shape = shape; bodies[0].CreateFixture(fd); } { FixtureDef fd = new FixtureDef(); fd.friction = 2.000000029802322e-01f; fd.restitution = 0.000000000000000e+00f; fd.density = 0.000000000000000e+00f; fd.isSensor = false; fd.filter.categoryBits = (1); fd.filter.maskBits = (65535); fd.filter.groupIndex = (0); EdgeShape shape = new EdgeShape(); Vector2[] vs = new Vector2[4]; ; vs[0] = new Vector2(1.918307685852051e+01f, 3.306496143341064e+00f); vs[1] = new Vector2(1.703903770446777e+01f, 2.196289300918579e+00f); vs[2] = new Vector2(4.565430396770254e-41f, 0.000000000000000e+00f); vs[3] = new Vector2(0.000000000000000e+00f, 1.216642260551453e-01f); shape.SetTwoSided(vs[0], vs[1]); ; fd.shape = shape; bodies[0].CreateFixture(fd); } { FixtureDef fd = new FixtureDef(); fd.friction = 2.000000029802322e-01f; fd.restitution = 0.000000000000000e+00f; fd.density = 0.000000000000000e+00f; fd.isSensor = false; fd.filter.categoryBits = (1); fd.filter.maskBits = (65535); fd.filter.groupIndex = (0); EdgeShape shape = new EdgeShape(); Vector2[] vs = new Vector2[4]; ; vs[0] = new Vector2(2.044397354125977e+01f, 4.096230506896973e+00f); vs[1] = new Vector2(1.918307685852051e+01f, 3.306496143341064e+00f); vs[2] = new Vector2(4.565430396770254e-41f, 0.000000000000000e+00f); vs[3] = new Vector2(0.000000000000000e+00f, 1.216642260551453e-01f); shape.SetTwoSided(vs[0], vs[1]); ; fd.shape = shape; bodies[0].CreateFixture(fd); } { FixtureDef fd = new FixtureDef(); fd.friction = 2.000000029802322e-01f; fd.restitution = 0.000000000000000e+00f; fd.density = 0.000000000000000e+00f; fd.isSensor = false; fd.filter.categoryBits = (1); fd.filter.maskBits = (65535); fd.filter.groupIndex = (0); EdgeShape shape = new EdgeShape(); Vector2[] vs = new Vector2[4]; ; vs[0] = new Vector2(2.176111412048340e+01f, 5.379695892333984e+00f); vs[1] = new Vector2(2.115560913085938e+01f, 4.700156211853027e+00f); vs[2] = new Vector2(4.565430396770254e-41f, 0.000000000000000e+00f); vs[3] = new Vector2(0.000000000000000e+00f, 1.216642260551453e-01f); shape.SetTwoSided(vs[0], vs[1]); ; fd.shape = shape; bodies[0].CreateFixture(fd); } { FixtureDef fd = new FixtureDef(); fd.friction = 2.000000029802322e-01f; fd.restitution = 0.000000000000000e+00f; fd.density = 0.000000000000000e+00f; fd.isSensor = false; fd.filter.categoryBits = (1); fd.filter.maskBits = (65535); fd.filter.groupIndex = (0); EdgeShape shape = new EdgeShape(); Vector2[] vs = new Vector2[4]; ; vs[0] = new Vector2(2.206690788269043e+01f, 5.190674781799316e+00f); vs[1] = new Vector2(2.176111412048340e+01f, 5.379695892333984e+00f); vs[2] = new Vector2(4.565430396770254e-41f, 0.000000000000000e+00f); vs[3] = new Vector2(0.000000000000000e+00f, 1.216642260551453e-01f); shape.SetTwoSided(vs[0], vs[1]); ; fd.shape = shape; bodies[0].CreateFixture(fd); } { FixtureDef fd = new FixtureDef(); fd.friction = 2.000000029802322e-01f; fd.restitution = 0.000000000000000e+00f; fd.density = 0.000000000000000e+00f; fd.isSensor = false; fd.filter.categoryBits = (1); fd.filter.maskBits = (65535); fd.filter.groupIndex = (0); EdgeShape shape = new EdgeShape(); Vector2[] vs = new Vector2[4]; ; vs[0] = new Vector2(1.703903770446777e+01f, 2.196289300918579e+00f); vs[1] = new Vector2(1.560352897644043e+01f, 1.560027003288269e+00f); vs[2] = new Vector2(4.565430396770254e-41f, 0.000000000000000e+00f); vs[3] = new Vector2(0.000000000000000e+00f, 1.216642260551453e-01f); shape.SetTwoSided(vs[0], vs[1]); ; fd.shape = shape; bodies[0].CreateFixture(fd); } { FixtureDef fd = new FixtureDef(); fd.friction = 2.000000029802322e-01f; fd.restitution = 0.000000000000000e+00f; fd.density = 0.000000000000000e+00f; fd.isSensor = false; fd.filter.categoryBits = (1); fd.filter.maskBits = (65535); fd.filter.groupIndex = (0); EdgeShape shape = new EdgeShape(); Vector2[] vs = new Vector2[4]; ; vs[0] = new Vector2(1.560352897644043e+01f, 1.560027003288269e+00f); vs[1] = new Vector2(1.428396320343018e+01f, 1.043329477310181e+00f); vs[2] = new Vector2(4.565430396770254e-41f, 0.000000000000000e+00f); vs[3] = new Vector2(0.000000000000000e+00f, 1.216642260551453e-01f); shape.SetTwoSided(vs[0], vs[1]); ; fd.shape = shape; bodies[0].CreateFixture(fd); } { FixtureDef fd = new FixtureDef(); fd.friction = 2.000000029802322e-01f; fd.restitution = 0.000000000000000e+00f; fd.density = 0.000000000000000e+00f; fd.isSensor = false; fd.filter.categoryBits = (1); fd.filter.maskBits = (65535); fd.filter.groupIndex = (0); EdgeShape shape = new EdgeShape(); Vector2[] vs = new Vector2[4]; ; vs[0] = new Vector2(2.115560913085938e+01f, 4.700156211853027e+00f); vs[1] = new Vector2(2.044397354125977e+01f, 4.096230506896973e+00f); vs[2] = new Vector2(4.565430396770254e-41f, 0.000000000000000e+00f); vs[3] = new Vector2(0.000000000000000e+00f, 1.216642260551453e-01f); shape.SetTwoSided(vs[0], vs[1]); ; fd.shape = shape; bodies[0].CreateFixture(fd); } } { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(2.079453659057617e+01f, 7.627632617950439e+00f); bd.angle = 4.814267158508301e-03f; bd.linearVelocity = new Vector2(0.000000000000000e+00f, 0.000000000000000e+00f); bd.angularVelocity = 0.000000000000000e+00f; bd.linearDamping = 0.000000000000000e+00f; bd.angularDamping = 0.000000000000000e+00f; bd.allowSleep = true; bd.awake = true; bd.fixedRotation = false; bd.bullet = true; //bd.active = true; bd.gravityScale = 1.000000000000000e+00f; bodies[1] = world.CreateBody(bd); { FixtureDef fd = new FixtureDef(); fd.friction = 5.000000000000000e-01f; fd.restitution = 6.999999880790710e-01f; fd.density = 5.000000074505806e-02f; fd.isSensor = false; fd.filter.categoryBits = (1); fd.filter.maskBits = (65535); fd.filter.groupIndex = (0); PolygonShape shape = new PolygonShape(); Vector2[] vs = new Vector2[4]; vs[0] = new Vector2(1.193307399749756e+00f, -7.795047014951706e-02f); vs[1] = new Vector2(1.193307399749756e+00f, 9.368468075990677e-02f); vs[2] = new Vector2(-1.108393430709839e+00f, 1.137156039476395e-01f); vs[3] = new Vector2(-1.108393430709839e+00f, -9.785395860671997e-02f); shape.Set(vs); fd.shape = shape; bodies[1].CreateFixture(fd); } } return(world); }
/// <summary> /// Components initialization of the actor. Override this method with actor-specific components initialization code. /// </summary> /// <remarks> /// Makes children bodies as the part of this body. /// Also calls <see cref="InitializeComponents"/> for its children. /// </remarks> public virtual void InitializeComponents() { foreach (Actor child in Children) { if (Body != null && child.Body != null) { // make child body as the part of the parent body // originally was used WeldJoint to make two bodies together // but the joint constraint sometimes produces strange behaviour (and also crashes) // FarseerPhysics.Factories.JointFactory.CreateWeldJoint(Screen.World, Body, child.Body, new Vector2()); // new child angle, relative to the actor body float newChildAngle = child.Body.Rotation - Body.Rotation; // vector to make child shapes relative to the actor body Vector2 moveToParent = Vector2.Transform(child.Body.Position, Matrix.CreateTranslation(-Body.Position.X, -Body.Position.Y, 0f) * Matrix.CreateRotationZ(-Body.Rotation) * Matrix.CreateTranslation(Body.Position.X, Body.Position.Y, 0f)) - Body.Position; foreach (Fixture fixture in child.Body.FixtureList) { Shape shape = null; // move shape according to the parent body // move polygon shape if (fixture.ShapeType == ShapeType.Polygon) { PolygonShape polygon = fixture.Shape as PolygonShape; polygon.Vertices.Rotate(newChildAngle); polygon.Vertices.Translate(moveToParent); Debug.Assert(polygon.Vertices.IsCounterClockWise()); Debug.Assert(!polygon.Vertices.CheckPolygon()); // reset polygon polygon.Set(polygon.Vertices); shape = polygon; } // move circle shape else if (fixture.ShapeType == ShapeType.Circle) { CircleShape circle = fixture.Shape as CircleShape; circle.Position += moveToParent; shape = circle; } // move edge shape else if (fixture.ShapeType == ShapeType.Edge) { EdgeShape edge = fixture.Shape as EdgeShape; Matrix rotationMatrix = Matrix.CreateRotationZ(newChildAngle); if (edge.HasVertex0) { edge.Vertex0 = Vector2.Transform(edge.Vertex0, rotationMatrix) + moveToParent; } if (edge.HasVertex3) { edge.Vertex3 = Vector2.Transform(edge.Vertex3, rotationMatrix) + moveToParent; } edge.Vertex1 = Vector2.Transform(edge.Vertex1, rotationMatrix) + moveToParent; edge.Vertex2 = Vector2.Transform(edge.Vertex2, rotationMatrix) + moveToParent; shape = edge; } // create new fixture if (shape != null) { Fixture newFixture = Body.CreateFixture(shape, child); // copy all settings from original fixture newFixture.Restitution = fixture.Restitution; newFixture.Friction = fixture.Friction; newFixture.IsSensor = fixture.IsSensor; newFixture.CollisionGroup = fixture.CollisionGroup; newFixture.CollisionCategories = fixture.CollisionCategories; newFixture.CollidesWith = fixture.CollidesWith; // connect collision events to child events newFixture.OnCollision += child.OnBodyCollision; newFixture.OnSeparation += child.OnBodySeparation; } } // reset child angle and position child.Angle = child.Body.Rotation; child.Position = child.Body.Position; // remove original body Screen.World.RemoveBody(child.Body); // set child body as parent body child._body = Body; } child.InitializeComponents(); } }
public CompoundShapes() { { BodyDef bd = new BodyDef(); bd.position = new Vector2(0.0, 0.0); Body body = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(50.0, 0.0), new Vector2(-50.0, 0.0)); body.CreateFixture(shape, 0.0); } { CircleShape circle1 = new CircleShape(); circle1._radius = 0.5f; circle1._p = new Vector2(-0.5f, 0.5f); CircleShape circle2 = new CircleShape(); circle2._radius = 0.5f; circle2._p = new Vector2(0.5f, 0.5f); for (int i = 0; i < 10; ++i) { double x = Rand.RandomFloat(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(x + 5.0f, 1.05f + 2.5f * i); bd.angle = Rand.RandomFloat(-Alt.Box2D.Settings.b2_pi, Alt.Box2D.Settings.b2_pi); Body body = _world.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 Vector2(0.0f, -0.5f), 0.5f * Alt.Box2D.Settings.b2_pi); for (int i = 0; i < 10; ++i) { double x = Rand.RandomFloat(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(x - 5.0f, 1.05f + 2.5f * i); bd.angle = Rand.RandomFloat(-Alt.Box2D.Settings.b2_pi, Alt.Box2D.Settings.b2_pi); Body body = _world.CreateBody(bd); body.CreateFixture(polygon1, 2.0f); body.CreateFixture(polygon2, 2.0f); } } { Alt.Box2D.Transform xf1 = new Alt.Box2D.Transform(); xf1.R.Set(0.3524f * Alt.Box2D.Settings.b2_pi); xf1.Position = MathUtils.Multiply(ref xf1.R, new Vector2(1.0f, 0.0f)); Vector2[] vertices = new Vector2[3]; PolygonShape triangle1 = new PolygonShape(); vertices[0] = MathUtils.Multiply(ref xf1, new Vector2(-1.0f, 0.0f)); vertices[1] = MathUtils.Multiply(ref xf1, new Vector2(1.0f, 0.0f)); vertices[2] = MathUtils.Multiply(ref xf1, new Vector2(0.0f, 0.5f)); triangle1.Set(vertices, 3); Alt.Box2D.Transform xf2 = new Alt.Box2D.Transform(); xf2.R.Set(-0.3524f * Alt.Box2D.Settings.b2_pi); xf2.Position = MathUtils.Multiply(ref xf2.R, new Vector2(-1.0f, 0.0f)); PolygonShape triangle2 = new PolygonShape(); vertices[0] = MathUtils.Multiply(ref xf2, new Vector2(-1.0f, 0.0f)); vertices[1] = MathUtils.Multiply(ref xf2, new Vector2(1.0f, 0.0f)); vertices[2] = MathUtils.Multiply(ref xf2, new Vector2(0.0f, 0.5f)); triangle2.Set(vertices, 3); for (int i = 0; i < 10; ++i) { double x = Rand.RandomFloat(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(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 Vector2(-1.45f, 2.35f), 0.2f); PolygonShape right = new PolygonShape(); right.SetAsBox(0.15f, 2.7f, new Vector2(1.45f, 2.35f), -0.2f); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.0f, 2.0f); Body body = _world.CreateBody(bd); body.CreateFixture(bottom, 4.0f); body.CreateFixture(left, 4.0f); body.CreateFixture(right, 4.0f); } }
public Car() { 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 = new float[] { 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._dynamicBody; Body body = m_world.CreateBody(bd); PolygonShape box = new PolygonShape(); box.SetAsBox(10.0f, 0.25f); box.Density = 1; body.CreateFixture(box); RevoluteJointDef jd = new RevoluteJointDef(); jd.Initialize(ground, body, body.GetPosition()); jd.lowerAngle = -8.0f * (float)Math.PI / 180.0f; jd.upperAngle = 8.0f * (float)Math.PI / 180.0f; jd.enableLimit = true; m_world.CreateJoint(jd); body.ApplyAngularImpulse(100.0f, true); } // 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._dynamicBody; 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); box.Density = 0.5f; Body body = null; BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(230.0f, 0.5f); body = m_world.CreateBody(bd); body.CreateFixture(box); bd.Position.Set(230.0f, 1.5f); body = m_world.CreateBody(bd); body.CreateFixture(box); bd.Position.Set(230.0f, 2.5f); body = m_world.CreateBody(bd); body.CreateFixture(box); bd.Position.Set(230.0f, 3.5f); body = m_world.CreateBody(bd); body.CreateFixture(box); bd.Position.Set(230.0f, 4.5f); body = m_world.CreateBody(bd); body.CreateFixture(box); } // Car { PolygonShape chassis = new PolygonShape(); Vec2[] vertices = new Vec2[8]; vertices[0].Set(-1.5f, -0.5f); vertices[1].Set(1.5f, -0.5f); vertices[2].Set(1.5f, 0.0f); vertices[3].Set(0.0f, 0.9f); vertices[4].Set(-1.15f, 0.9f); vertices[5].Set(-1.5f, 0.2f); chassis.Set(vertices, 6); CircleShape circle = new CircleShape(); circle.m_radius = 0.4f; BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(0.0f, 1.0f); m_car = m_world.CreateBody(bd); m_car.CreateFixture(chassis); 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 Cantilever() { Body ground; { var bd = new BodyDef(); ground = World.CreateBody(bd); var shape = new EdgeShape(); shape.Set(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { var shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.125f); var fd = new FixtureDef(); fd.Shape = shape; fd.Density = 20.0f; var jd = new WeldJointDef(); var prevBody = ground; for (var i = 0; i < Count; ++i) { var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(-14.5f + 1.0f * i, 5.0f); var body = World.CreateBody(bd); body.CreateFixture(fd); var anchor = new Vector2(-15.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); World.CreateJoint(jd); prevBody = body; } } { var shape = new PolygonShape(); shape.SetAsBox(1.0f, 0.125f); var fd = new FixtureDef(); fd.Shape = shape; fd.Density = 20.0f; var jd = new WeldJointDef(); jd.FrequencyHz = 5.0f; jd.DampingRatio = 0.7f; var prevBody = ground; for (var i = 0; i < 3; ++i) { var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(-14.0f + 2.0f * i, 15.0f); var body = World.CreateBody(bd); body.CreateFixture(fd); var anchor = new Vector2(-15.0f + 2.0f * i, 15.0f); jd.Initialize(prevBody, body, anchor); World.CreateJoint(jd); prevBody = body; } } { var shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.125f); var fd = new FixtureDef(); fd.Shape = shape; fd.Density = 20.0f; var jd = new WeldJointDef(); var prevBody = ground; for (var i = 0; i < Count; ++i) { var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(-4.5f + 1.0f * i, 5.0f); var body = World.CreateBody(bd); body.CreateFixture(fd); if (i > 0) { var anchor = new Vector2(-5.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); World.CreateJoint(jd); } prevBody = body; } } { var shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.125f); var fd = new FixtureDef(); fd.Shape = shape; fd.Density = 20.0f; var jd = new WeldJointDef(); jd.FrequencyHz = 8.0f; jd.DampingRatio = 0.7f; var prevBody = ground; for (var i = 0; i < Count; ++i) { var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(5.5f + 1.0f * i, 10.0f); var body = World.CreateBody(bd); body.CreateFixture(fd); if (i > 0) { var anchor = new Vector2(5.0f + 1.0f * i, 10.0f); jd.Initialize(prevBody, body, anchor); World.CreateJoint(jd); } prevBody = body; } } for (var i = 0; i < 2; ++i) { var vertices = new Vector2 [3]; vertices[0].Set(-0.5f, 0.0f); vertices[1].Set(0.5f, 0.0f); vertices[2].Set(0.0f, 1.5f); var shape = new PolygonShape(); shape.Set(vertices); var fd = new FixtureDef(); fd.Shape = shape; fd.Density = 1.0f; var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(-8.0f + 8.0f * i, 12.0f); var body = World.CreateBody(bd); body.CreateFixture(fd); } for (var i = 0; i < 2; ++i) { var shape = new CircleShape(); shape.Radius = 0.5f; var fd = new FixtureDef(); fd.Shape = shape; fd.Density = 1.0f; var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(-6.0f + 6.0f * i, 10.0f); var body = World.CreateBody(bd); body.CreateFixture(fd); } }
private CollisionProcessingTest() { //Ground BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); const float xLo = -5.0f; const float xHi = 5.0f; const float yLo = 2.0f; const float yHi = 35.0f; // Small triangle Vertices vertices = new Vertices(3); vertices.Add(new Vector2(-1.0f, 0.0f)); vertices.Add(new Vector2(1.0f, 0.0f)); vertices.Add(new Vector2(0.0f, 2.0f)); PolygonShape polygon = new PolygonShape(vertices, 1); Body body1 = BodyFactory.CreateBody(World); body1.BodyType = BodyType.Dynamic; body1.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); Fixture fixture = body1.CreateFixture(polygon); fixture.OnCollision += OnCollision; // Large triangle (recycle definitions) vertices[0] *= 2.0f; vertices[1] *= 2.0f; vertices[2] *= 2.0f; polygon.Set(vertices); Body body2 = BodyFactory.CreateBody(World); body2.BodyType = BodyType.Dynamic; body2.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body2.CreateFixture(polygon); fixture.OnCollision += OnCollision; // Small box Vertices smallBox = PolygonTools.CreateRectangle(1.0f, 0.5f); polygon.Set(smallBox); Body body3 = BodyFactory.CreateBody(World); body3.BodyType = BodyType.Dynamic; body3.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body3.CreateFixture(polygon); fixture.OnCollision += OnCollision; // Large box (recycle definitions) Vertices largeBox = PolygonTools.CreateRectangle(2.0f, 1.0f); polygon.Set(largeBox); Body body4 = BodyFactory.CreateBody(World); body4.BodyType = BodyType.Dynamic; body4.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body4.CreateFixture(polygon); fixture.OnCollision += OnCollision; // Small circle CircleShape circle = new CircleShape(1.0f, 1); Body body5 = BodyFactory.CreateBody(World); body5.BodyType = BodyType.Dynamic; body5.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body5.CreateFixture(circle); fixture.OnCollision += OnCollision; // Large circle circle.Radius *= 2.0f; Body body6 = BodyFactory.CreateBody(World); body6.BodyType = BodyType.Dynamic; body6.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body6.CreateFixture(circle); fixture.OnCollision += OnCollision; }
public Cantilever() { Body ground = null; { BodyDef bd = new BodyDef(); ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(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 = new Vector2(-14.5f + 1.0f * i, 5.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); Vector2 anchor = new Vector2(-15.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); _world.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 = new Vector2(-14.5f + 1.0f * i, 15.0f); bd.inertiaScale = 10.0f; Body body = _world.CreateBody(bd); body.CreateFixture(fd); Vector2 anchor = new Vector2(-15.0f + 1.0f * i, 15.0f); jd.Initialize(prevBody, body, anchor); _world.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 = new Vector2(-4.5f + 1.0f * i, 5.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); if (i > 0) { Vector2 anchor = new Vector2(-5.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); _world.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 = new Vector2(5.5f + 1.0f * i, 10.0f); bd.inertiaScale = 10.0f; Body body = _world.CreateBody(bd); body.CreateFixture(fd); if (i > 0) { Vector2 anchor = new Vector2(5.0f + 1.0f * i, 10.0f); jd.Initialize(prevBody, body, anchor); _world.CreateJoint(jd); } prevBody = body; } } for (int i = 0; i < 2; ++i) { Vector2[] vertices = new Vector2[3]; vertices[0] = new Vector2(-0.5f, 0.0f); vertices[1] = new Vector2(0.5f, 0.0f); vertices[2] = new Vector2(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 = new Vector2(-8.0f + 8.0f * i, 12.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); } for (int i = 0; i < 2; ++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.type = BodyType.Dynamic; bd.position = new Vector2(-6.0f + 6.0f * i, 10.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); } }
void CreateLeg(double s, Vector2 wheelAnchor) { Vector2 p1 = new Vector2(5.4f * s, -6.1f); Vector2 p2 = new Vector2(7.2f * s, -1.2f); Vector2 p3 = new Vector2(4.3f * s, -1.9f); Vector2 p4 = new Vector2(3.1f * s, 0.8f); Vector2 p5 = new Vector2(6.0f * s, 1.5f); Vector2 p6 = new Vector2(2.5f * s, 3.7f); FixtureDef fd1 = new FixtureDef(); FixtureDef fd2 = new FixtureDef(); fd1.filter.groupIndex = -1; fd2.filter.groupIndex = -1; fd1.density = 1.0f; fd2.density = 1.0f; PolygonShape poly1 = new PolygonShape(); PolygonShape poly2 = new PolygonShape(); Vector2[] vertices = new Vector2[3]; if (s > 0.0f) { vertices[0] = p1; vertices[1] = p2; vertices[2] = p3; poly1.Set(vertices, 3); vertices[0] = Vector2.Zero; vertices[1] = p5 - p4; vertices[2] = p6 - p4; poly2.Set(vertices, 3); } else { vertices[0] = p1; vertices[1] = p3; vertices[2] = p2; poly1.Set(vertices, 3); vertices[0] = Vector2.Zero; vertices[1] = p6 - p4; vertices[2] = p5 - p4; poly2.Set(vertices, 3); } fd1.shape = poly1; fd2.shape = poly2; BodyDef bd1 = new BodyDef(); BodyDef bd2 = new BodyDef(); bd1.type = BodyType.Dynamic; bd2.type = BodyType.Dynamic; bd1.position = _offset; bd2.position = p4 + _offset; bd1.angularDamping = 10.0f; bd2.angularDamping = 10.0f; Body body1 = _world.CreateBody(bd1); Body body2 = _world.CreateBody(bd2); body1.CreateFixture(fd1); body2.CreateFixture(fd2); DistanceJointDef djd = new DistanceJointDef(); // Using a soft distanceraint 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 + _offset, p5 + _offset); _world.CreateJoint(djd); djd.Initialize(body1, body2, p3 + _offset, p4 + _offset); _world.CreateJoint(djd); djd.Initialize(body1, _wheel, p3 + _offset, wheelAnchor + _offset); _world.CreateJoint(djd); djd.Initialize(body2, _wheel, p6 + _offset, wheelAnchor + _offset); _world.CreateJoint(djd); RevoluteJointDef rjd = new RevoluteJointDef(); rjd.Initialize(body2, _chassis, p4 + _offset); _world.CreateJoint(rjd); }
protected override void Create() { _hz = 4.0f; _zeta = 0.7f; _speed = 50.0f; Body ground; { var bd = new BodyDef(); ground = World.CreateBody(bd); var shape = new EdgeShape(); var fd = new FixtureDef(); fd.Shape = shape; fd.Density = 0.0f; fd.Friction = 0.6f; shape.Set(new Vector2(-20.0f, 0.0f), new Vector2(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 (var i = 0; i < 10; ++i) { var y2 = hs[i]; shape.Set(new Vector2(x, y1), new Vector2(x + dx, y2)); ground.CreateFixture(fd); y1 = y2; x += dx; } for (var i = 0; i < 10; ++i) { var y2 = hs[i]; shape.Set(new Vector2(x, y1), new Vector2(x + dx, y2)); ground.CreateFixture(fd); y1 = y2; x += dx; } shape.Set(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f)); ground.CreateFixture(fd); x += 80.0f; shape.Set(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f)); ground.CreateFixture(fd); x += 40.0f; shape.Set(new Vector2(x, 0.0f), new Vector2(x + 10.0f, 5.0f)); ground.CreateFixture(fd); x += 20.0f; shape.Set(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f)); ground.CreateFixture(fd); x += 40.0f; shape.Set(new Vector2(x, 0.0f), new Vector2(x, 20.0f)); ground.CreateFixture(fd); } // Teeter { var bd = new BodyDef(); bd.Position.Set(140.0f, 1.0f); bd.BodyType = BodyType.DynamicBody; var body = World.CreateBody(bd); var box = new PolygonShape(); box.SetAsBox(10.0f, 0.25f); body.CreateFixture(box, 1.0f); var jd = new RevoluteJointDef(); jd.Initialize(ground, body, body.GetPosition()); jd.LowerAngle = -8.0f * Settings.Pi / 180.0f; jd.UpperAngle = 8.0f * Settings.Pi / 180.0f; jd.EnableLimit = true; World.CreateJoint(jd); body.ApplyAngularImpulse(100.0f, true); } // Bridge { var N = 20; var shape = new PolygonShape(); shape.SetAsBox(1.0f, 0.125f); var fd = new FixtureDef(); fd.Shape = shape; fd.Density = 1.0f; fd.Friction = 0.6f; var jd = new RevoluteJointDef(); var prevBody = ground; for (var i = 0; i < N; ++i) { var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(161.0f + 2.0f * i, -0.125f); var body = World.CreateBody(bd); body.CreateFixture(fd); var anchor = new Vector2(160.0f + 2.0f * i, -0.125f); jd.Initialize(prevBody, body, anchor); World.CreateJoint(jd); prevBody = body; } { var anchor = new Vector2(160.0f + 2.0f * N, -0.125f); jd.Initialize(prevBody, ground, anchor); World.CreateJoint(jd); } } // Boxes { var box = new PolygonShape(); box.SetAsBox(0.5f, 0.5f); Body body = null; var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(230.0f, 0.5f); body = World.CreateBody(bd); body.CreateFixture(box, 0.5f); bd.Position.Set(230.0f, 1.5f); body = World.CreateBody(bd); body.CreateFixture(box, 0.5f); bd.Position.Set(230.0f, 2.5f); body = World.CreateBody(bd); body.CreateFixture(box, 0.5f); bd.Position.Set(230.0f, 3.5f); body = World.CreateBody(bd); body.CreateFixture(box, 0.5f); bd.Position.Set(230.0f, 4.5f); body = World.CreateBody(bd); body.CreateFixture(box, 0.5f); } // Car { var chassis = new PolygonShape(); var vertices = new Vector2[8]; vertices[0].Set(-1.5f, -0.5f); vertices[1].Set(1.5f, -0.5f); vertices[2].Set(1.5f, 0.0f); vertices[3].Set(0.0f, 0.9f); vertices[4].Set(-1.15f, 0.9f); vertices[5].Set(-1.5f, 0.2f); chassis.Set(vertices); var circle = new CircleShape(); circle.Radius = 0.4f; var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(0.0f, 1.0f); _car = World.CreateBody(bd); _car.CreateFixture(chassis, 1.0f); var fd = new FixtureDef(); fd.Shape = circle; fd.Density = 1.0f; fd.Friction = 0.9f; bd.Position.Set(-1.0f, 0.35f); _wheel1 = World.CreateBody(bd); _wheel1.CreateFixture(fd); bd.Position.Set(1.0f, 0.4f); _wheel2 = World.CreateBody(bd); _wheel2.CreateFixture(fd); var jd = new WheelJointDef(); var axis = new Vector2(0.0f, 1.0f); jd.Initialize(_car, _wheel1, _wheel1.GetPosition(), axis); jd.MotorSpeed = 0.0f; jd.MaxMotorTorque = 20.0f; jd.EnableMotor = true; jd.FrequencyHz = _hz; jd.DampingRatio = _zeta; _spring1 = (WheelJoint)World.CreateJoint(jd); jd.Initialize(_car, _wheel2, _wheel2.GetPosition(), axis); jd.MotorSpeed = 0.0f; jd.MaxMotorTorque = 10.0f; jd.EnableMotor = false; jd.FrequencyHz = _hz; jd.DampingRatio = _zeta; _spring2 = (WheelJoint)World.CreateJoint(jd); } }
private void CreateLeg(float s, Vector2 wheelAnchor) { var p1 = new Vector2(5.4f * s, -6.1f); var p2 = new Vector2(7.2f * s, -1.2f); var p3 = new Vector2(4.3f * s, -1.9f); var p4 = new Vector2(3.1f * s, 0.8f); var p5 = new Vector2(6.0f * s, 1.5f); var p6 = new Vector2(2.5f * s, 3.7f); var fd1 = new FixtureDef { Filter = { GroupIndex = -1 }, Density = 1.0f }; var fd2 = new FixtureDef { Filter = { GroupIndex = -1 }, Density = 1.0f }; var poly1 = new PolygonShape(); var poly2 = new PolygonShape(); if (s > 0.0f) { var vertices = new Vector2[3]; vertices[0] = p1; vertices[1] = p2; vertices[2] = p3; poly1.Set(vertices); vertices[0] = Vector2.Zero; vertices[1] = p5 - p4; vertices[2] = p6 - p4; poly2.Set(vertices); } else { var vertices = new Vector2[3]; vertices[0] = p1; vertices[1] = p3; vertices[2] = p2; poly1.Set(vertices); vertices[0] = Vector2.Zero; vertices[1] = p6 - p4; vertices[2] = p5 - p4; poly2.Set(vertices); } fd1.Shape = poly1; fd2.Shape = poly2; var bd1 = new BodyDef(); var bd2 = new BodyDef(); bd1.BodyType = BodyType.DynamicBody; bd2.BodyType = BodyType.DynamicBody; bd1.Position = _offset; bd2.Position = p4 + _offset; bd1.AngularDamping = 10.0f; bd2.AngularDamping = 10.0f; var body1 = World.CreateBody(bd1); var body2 = World.CreateBody(bd2); body1.CreateFixture(fd1); body2.CreateFixture(fd2); var 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 + _offset, p5 + _offset); World.CreateJoint(djd); djd.Initialize(body1, body2, p3 + _offset, p4 + _offset); World.CreateJoint(djd); djd.Initialize(body1, _wheel, p3 + _offset, wheelAnchor + _offset); World.CreateJoint(djd); djd.Initialize(body2, _wheel, p6 + _offset, wheelAnchor + _offset); World.CreateJoint(djd); var rjd = new RevoluteJointDef(); rjd.Initialize(body2, _chassis, p4 + _offset); World.CreateJoint(rjd); }
public Cantilever() { Body ground = null; { BodyDef bd = new BodyDef(); ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(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 = new Vector2(-14.5f + 1.0f * i, 5.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); Vector2 anchor = new Vector2(-15.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); _world.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 = new Vector2(-14.5f + 1.0f * i, 15.0f); bd.inertiaScale = 10.0f; Body body = _world.CreateBody(bd); body.CreateFixture(fd); Vector2 anchor = new Vector2(-15.0f + 1.0f * i, 15.0f); jd.Initialize(prevBody, body, anchor); _world.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 = new Vector2(-4.5f + 1.0f * i, 5.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); if (i > 0) { Vector2 anchor = new Vector2(-5.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); _world.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 = new Vector2(5.5f + 1.0f * i, 10.0f); bd.inertiaScale = 10.0f; Body body = _world.CreateBody(bd); body.CreateFixture(fd); if (i > 0) { Vector2 anchor = new Vector2(5.0f + 1.0f * i, 10.0f); jd.Initialize(prevBody, body, anchor); _world.CreateJoint(jd); } prevBody = body; } } for (int i = 0; i < 2; ++i) { Vector2[] vertices = new Vector2[3]; vertices[0] = new Vector2(-0.5f, 0.0f); vertices[1] = new Vector2(0.5f, 0.0f); vertices[2] = new Vector2(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 = new Vector2(-8.0f + 8.0f * i, 12.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); } for (int i = 0; i < 2; ++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.type = BodyType.Dynamic; bd.position = new Vector2(-6.0f + 6.0f * i, 10.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); } }
public CollisionProcessing() { // Ground body { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-50.0f, 0.0f), new Vector2(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 Vector2[] vertices = new Vector2[3]; vertices[0] = new Vector2(-1.0f, 0.0f); vertices[1] = new Vector2(1.0f, 0.0f); vertices[2] = new Vector2(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 = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(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 = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(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.type = BodyType.Dynamic; boxBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); Body body3 = _world.CreateBody(boxBodyDef); body3.CreateFixture(boxShapeDef); // Large box (recycle definitions) polygon.SetAsBox(2.0f, 1.0f); boxBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(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.type = BodyType.Dynamic; circleBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); Body body5 = _world.CreateBody(circleBodyDef); body5.CreateFixture(circleShapeDef); // Large circle circle._radius *= 2.0f; circleBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); Body body6 = _world.CreateBody(circleBodyDef); body6.CreateFixture(circleShapeDef); }
public Revolute() { Body ground; { var bd = new BodyDef(); ground = World.CreateBody(bd); var shape = new EdgeShape(); shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); var fd = new FixtureDef(); fd.Shape = shape; //fd.filter.categoryBits = 2; ground.CreateFixture(fd); } { var shape = new CircleShape(); shape.Radius = 0.5f; var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; var rjd = new RevoluteJointDef(); bd.Position.Set(-10.0f, 20.0f); var body = World.CreateBody(bd); body.CreateFixture(shape, 5.0f); var w = 100.0f; body.SetAngularVelocity(w); body.SetLinearVelocity(new Vector2(-8.0f * w, 0.0f)); rjd.Initialize(ground, body, new Vector2(-10.0f, 12.0f)); rjd.MotorSpeed = 1.0f * Settings.Pi; rjd.MaxMotorTorque = 10000.0f; rjd.EnableMotor = false; rjd.LowerAngle = -0.25f * Settings.Pi; rjd.UpperAngle = 0.5f * Settings.Pi; rjd.EnableLimit = true; rjd.CollideConnected = true; m_joint = (RevoluteJoint)World.CreateJoint(rjd); } { var circle_shape = new CircleShape(); circle_shape.Radius = 3.0f; var circle_bd = new BodyDef(); circle_bd.BodyType = BodyType.DynamicBody; circle_bd.Position.Set(5.0f, 30.0f); var fd = new FixtureDef(); fd.Density = 5.0f; var filter = fd.Filter; filter.MaskBits = 1; fd.Filter = filter; fd.Shape = circle_shape; m_ball = World.CreateBody(circle_bd); m_ball.CreateFixture(fd); var polygon_shape = new PolygonShape(); polygon_shape.SetAsBox(10.0f, 0.2f, new Vector2(-10.0f, 0.0f), 0.0f); var polygon_bd = new BodyDef(); polygon_bd.Position.Set(20.0f, 10.0f); polygon_bd.BodyType = BodyType.DynamicBody; polygon_bd.Bullet = true; var polygon_body = World.CreateBody(polygon_bd); polygon_body.CreateFixture(polygon_shape, 2.0f); var rjd = new RevoluteJointDef(); rjd.Initialize(ground, polygon_body, new Vector2(20.0f, 10.0f)); rjd.LowerAngle = -0.25f * Settings.Pi; rjd.UpperAngle = 0.0f * Settings.Pi; rjd.EnableLimit = true; World.CreateJoint(rjd); } // Tests mass computation of a small object far from the origin { var bodyDef = new BodyDef(); bodyDef.BodyType = BodyType.DynamicBody; var body = World.CreateBody(bodyDef); var polyShape = new PolygonShape(); var verts = new Vector2[3]; verts[0].Set(17.63f, 36.31f); verts[1].Set(17.52f, 36.69f); verts[2].Set(17.19f, 36.36f); polyShape.Set(verts); var polyFixtureDef = new FixtureDef(); polyFixtureDef.Shape = polyShape; polyFixtureDef.Density = 1; body.CreateFixture(polyFixtureDef); //assertion hits inside here } }
private DominosTest() { //Ground BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); { Vertices box = PolygonTools.CreateRectangle(6.0f, 0.25f); PolygonShape shape = new PolygonShape(box, 0); Body ground = BodyFactory.CreateBody(World); ground.Position = new Vector2(-1.5f, 10.0f); ground.CreateFixture(shape); } { Vertices box = PolygonTools.CreateRectangle(0.1f, 1.0f); PolygonShape shape = new PolygonShape(box, 20); for (int i = 0; i < 10; ++i) { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-6.0f + 1.0f * i, 11.25f); Fixture fixture = body.CreateFixture(shape); fixture.Friction = 0.1f; } } { Vertices box = PolygonTools.CreateRectangle(7.0f, 0.25f, Vector2.Zero, 0.3f); PolygonShape shape = new PolygonShape(box, 0); Body ground = BodyFactory.CreateBody(World); ground.Position = new Vector2(1.0f, 6.0f); ground.CreateFixture(shape); } Body b2; { Vertices box = PolygonTools.CreateRectangle(0.25f, 1.5f); PolygonShape shape = new PolygonShape(box, 0); b2 = BodyFactory.CreateBody(World); b2.Position = new Vector2(-7.0f, 4.0f); b2.CreateFixture(shape); } Body b3; { Vertices box = PolygonTools.CreateRectangle(6.0f, 0.125f); PolygonShape shape = new PolygonShape(box, 10); b3 = BodyFactory.CreateBody(World); b3.BodyType = BodyType.Dynamic; b3.Position = new Vector2(-0.9f, 1.0f); b3.Rotation = -0.15f; b3.CreateFixture(shape); } Vector2 anchor = new Vector2(-2.0f, 1.0f); //FixedRevoluteJoint jd = new FixedRevoluteJoint(b3, b3.GetLocalPoint(anchor), anchor); //jd.CollideConnected = true; //World.AddJoint(jd); Body b4; { Vertices box = PolygonTools.CreateRectangle(0.25f, 0.25f); PolygonShape shape = new PolygonShape(box, 10); b4 = BodyFactory.CreateBody(World); b4.BodyType = BodyType.Dynamic; b4.Position = new Vector2(-10.0f, 15.0f); b4.CreateFixture(shape); } anchor = new Vector2(-7.0f, 15.0f); //FixedRevoluteJoint jd2 = new FixedRevoluteJoint(b4, b4.GetLocalPoint(anchor), anchor); //World.AddJoint(jd2); Body b5; { b5 = BodyFactory.CreateBody(World); b5.BodyType = BodyType.Dynamic; b5.Position = new Vector2(6.5f, 3.0f); Vertices vertices = PolygonTools.CreateRectangle(1.0f, 0.1f, new Vector2(0.0f, -0.9f), 0.0f); PolygonShape shape = new PolygonShape(vertices, 10); Fixture fix = b5.CreateFixture(shape); fix.Friction = 0.1f; vertices = PolygonTools.CreateRectangle(0.1f, 1.0f, new Vector2(-0.9f, 0.0f), 0.0f); shape.Set(vertices); fix = b5.CreateFixture(shape); fix.Friction = 0.1f; vertices = PolygonTools.CreateRectangle(0.1f, 1.0f, new Vector2(0.9f, 0.0f), 0.0f); shape.Set(vertices); fix = b5.CreateFixture(shape); fix.Friction = 0.1f; } anchor = new Vector2(6.0f, 2.0f); //FixedRevoluteJoint jd3 = new FixedRevoluteJoint(b5, b5.GetLocalPoint(anchor), anchor); //World.AddJoint(jd3); Body b6; { Vertices box = PolygonTools.CreateRectangle(1.0f, 0.1f); PolygonShape shape = new PolygonShape(box, 30); b6 = BodyFactory.CreateBody(World); b6.BodyType = BodyType.Dynamic; b6.Position = new Vector2(6.5f, 4.1f); b6.CreateFixture(shape); } anchor = new Vector2(1.0f, -0.1f); RevoluteJoint jd4 = new RevoluteJoint(b5, b6, b5.GetLocalPoint(b6.GetWorldPoint(anchor)), anchor); jd4.CollideConnected = true; World.AddJoint(jd4); Body b7; { Vertices box = PolygonTools.CreateRectangle(0.1f, 1.0f); PolygonShape shape = new PolygonShape(box, 10); b7 = BodyFactory.CreateBody(World); b7.BodyType = BodyType.Dynamic; b7.Position = new Vector2(7.4f, 1.0f); b7.CreateFixture(shape); } DistanceJoint djd = new DistanceJoint(b3, b7, new Vector2(6.0f, 0.0f), new Vector2(0.0f, -1.0f)); Vector2 d = djd.BodyB.GetWorldPoint(djd.LocalAnchorB) - djd.BodyA.GetWorldPoint(djd.LocalAnchorA); djd.Length = d.Length(); World.AddJoint(djd); { const float radius = 0.2f; CircleShape shape = new CircleShape(radius, 10); for (int i = 0; i < 4; ++i) { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(5.9f + 2.0f * radius * i, 2.4f); Fixture fix = body.CreateFixture(shape); fix.OnCollision += BallCollision; } } }
public CollisionProcessing() { // 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 = m_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.type = BodyType._dynamicBody; triangleBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); Body body1 = m_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(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); Body body2 = m_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.type = BodyType._dynamicBody; boxBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); Body body3 = m_world.CreateBody(boxBodyDef); body3.CreateFixture(boxShapeDef); // Large box (recycle definitions) polygon.SetAsBox(2.0f, 1.0f); boxBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); Body body4 = m_world.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._dynamicBody; circleBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); Body body5 = m_world.CreateBody(circleBodyDef); body5.CreateFixture(circleShapeDef); // Large circle circle.m_radius *= 2.0f; circleBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); Body body6 = m_world.CreateBody(circleBodyDef); body6.CreateFixture(circleShapeDef); }
public void Create(BroadPhase broadPhase, Body body, Transform xf, FixtureDef def) { UserData = def.UserData; Friction = def.Friction; Restitution = def.Restitution; Density = def.Density; _body = body; _next = null; Filter = def.Filter; _isSensor = def.IsSensor; _type = def.Type; // Allocate and initialize the child shape. switch (_type) { case ShapeType.CircleShape: { CircleShape circle = new CircleShape(); CircleDef circleDef = (CircleDef)def; circle._position = circleDef.LocalPosition; circle._radius = circleDef.Radius; _shape = circle; } break; case ShapeType.PolygonShape: { PolygonShape polygon = new PolygonShape(); PolygonDef polygonDef = (PolygonDef)def; polygon.Set(polygonDef.Vertices, polygonDef.VertexCount); _shape = polygon; } break; case ShapeType.EdgeShape: { EdgeShape edge = new EdgeShape(); EdgeDef edgeDef = (EdgeDef)def; edge.Set(edgeDef.Vertex1, edgeDef.Vertex2); _shape = edge; } break; default: Box2DNetDebug.Assert(false); break; } // Create proxy in the broad-phase. AABB aabb; _shape.ComputeAABB(out aabb, xf); bool inRange = broadPhase.InRange(aabb); // You are creating a shape outside the world box. Box2DNetDebug.Assert(inRange); if (inRange) { _proxyId = broadPhase.CreateProxy(aabb, this); } else { _proxyId = PairManager.NullProxy; } }