public Confined() { { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); // Floor shape.SetAsEdge(new Vec2(-10.0f, 0.0f), new Vec2(10.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); // Left wall shape.SetAsEdge(new Vec2(-10.0f, 0.0f), new Vec2(-10.0f, 20.0f)); ground.CreateFixture(shape, 0.0f); // Right wall shape.SetAsEdge(new Vec2(10.0f, 0.0f), new Vec2(10.0f, 20.0f)); ground.CreateFixture(shape, 0.0f); // Roof shape.SetAsEdge(new Vec2(-10.0f, 20.0f), new Vec2(10.0f, 20.0f)); ground.CreateFixture(shape, 0.0f); } m_world.Gravity = new Vec2(0.0f, 0.0f); }
public Breakable() { // Ground body { BodyDef bd = new BodyDef(); Body 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); } // Breakable dynamic body { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.0f, 40.0f); bd.angle = 0.25f * Settings.b2_pi; _body1 = _world.CreateBody(bd); _shape1 = new PolygonShape(); _shape1.SetAsBox(0.5f, 0.5f, new Vector2(-0.5f, 0.0f), 0.0f); _piece1 = _body1.CreateFixture(_shape1, 1.0f); _shape2 = new PolygonShape(); _shape2.SetAsBox(0.5f, 0.5f, new Vector2(0.5f, 0.0f), 0.0f); _piece2 = _body1.CreateFixture(_shape2, 1.0f); } _break = false; _broke = false; }
public SphereStack() { { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); for (int i = 0; i < e_count; ++i) { shape.Radius = Rand.RandomFloat(0.5f, 0.5f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(0.0f, 4.0f + 3.0f * i); m_bodies[i] = m_world.CreateBody(bd); m_bodies[i].CreateFixture(shape, 1.0f); } } }
public SphereStack() { { BodyDef bd = new BodyDef(); Body 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); } { CircleShape shape = new CircleShape(); shape._radius = 1.0f; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.0f, 4.0f + 3.0f * i); _bodies[i] = _world.CreateBody(bd); _bodies[i].CreateFixture(shape, 1.0f); //_bodies[i].SetLinearVelocity(new Vector2(0.0f, -100.0f)); } } }
public LineJoint() { Body ground = null; { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); BodyDef bd = new BodyDef(); ground = _world.CreateBody(bd); ground.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 2.0f); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.0f, 7.0f); Body body = _world.CreateBody(bd); body.CreateFixture(shape, 1.0f); LineJointDef jd = new LineJointDef(); Vector2 axis = new Vector2(2.0f, 1.0f); axis.Normalize(); jd.Initialize(ground, body, new Vector2(0.0f, 8.5f), axis); jd.motorSpeed = 0.0f; jd.maxMotorForce = 100.0f; jd.enableMotor = true; jd.lowerTranslation = -4.0f; jd.upperTranslation = 4.0f; jd.enableLimit = true; _world.CreateJoint(jd); } }
VaryingRestitution() { { BodyDef bd = new BodyDef(); Body 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); } { CircleShape shape = new CircleShape(); shape._radius = 1.0f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 1.0f; float[] restitution = new float[7] {0.0f, 0.1f, 0.3f, 0.5f, 0.75f, 0.9f, 1.0f}; for (int i = 0; i < 7; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-10.0f + 3.0f * i, 20.0f); Body body = _world.CreateBody(bd); fd.restitution = restitution[i]; body.CreateFixture(fd); } } }
public VaryingRestitution() { { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); shape.Radius = 1.0f; FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 1.0f; float[] restitution = {0.0f, 0.1f, 0.3f, 0.5f, 0.75f, 0.9f, 1.0f}; for (int i = 0; i < 7; ++i) { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(-10.0f + 3.0f * i, 20.0f); Body body = m_world.CreateBody(bd); fd.Restitution = restitution[i]; fd.UserData = i; body.CreateFixture(fd); } } }
public void TestPolygonPositions() { PolygonShape polygon = new PolygonShape(1, m_metadata, m_extent, m_parts, m_positions); Assert.AreEqual(polygon[0][0], new Cartographic(0.0, 0.0, 0.0)); Assert.AreEqual(polygon[0][1], new Cartographic(0.0, Constants.RadiansPerDegree, 0.0)); Assert.AreEqual(polygon[0][2], new Cartographic(Constants.RadiansPerDegree, Constants.RadiansPerDegree, 0.0)); Assert.AreEqual(polygon[0][3], new Cartographic(Constants.RadiansPerDegree, 0.0, 0.0)); Assert.AreEqual(polygon[0][4], new Cartographic(0.0, 0.0, 0.0)); }
/// <summary> /// Writes the MultiPatch shape to its <see cref="CzmlDocument"/> as a series of polygon packets. /// </summary> public override void Write() { MultiPatchShape multipatch = (MultiPatchShape)m_shape; List<Polygon> polygons = new List<Polygon>(); StringDictionary metadata = new StringDictionary(); var fields = multipatch.GetMetadataFields(); foreach (String field in fields) { metadata.Add(field, multipatch.GetMetadataValue(field)); } for (int i = 0; i < multipatch.Count; i++) { List<ShapePart> polygonParts = new List<ShapePart>(); PolygonShape temp; switch (multipatch.GetPartType(i)) { case MultiPatchPartType.TriangleFan: case MultiPatchPartType.TriangleStrip: for (int j = 2; j < multipatch[i].Count; j++) { int firstIndex = (multipatch.GetPartType(i) == MultiPatchPartType.TriangleFan) ? 0 : j - 2; Cartographic[] vertices = new Cartographic[] { multipatch[i][firstIndex], multipatch[i][j - 1], multipatch[i][j] }; ShapePart triangle = new ShapePart(vertices, 0, vertices.Length); PolygonShape p = new PolygonShape(multipatch.RecordNumber, metadata, multipatch.Extent, new ShapePart[] { triangle }); (new Polygon(p, m_document, m_color)).Write(); } break; case MultiPatchPartType.Ring: while (i < multipatch.Count && multipatch.GetPartType(i) == MultiPatchPartType.Ring) { temp = new PolygonShape(multipatch.RecordNumber, metadata, multipatch.Extent, new ShapePart[] { multipatch[i] }); (new Polygon(temp, m_document, m_color)).Write(); i++; } i--; break; case MultiPatchPartType.OuterRing: case MultiPatchPartType.FirstRing: polygonParts.Add(multipatch[i]); MultiPatchPartType comparisonType = (multipatch.GetPartType(i) == MultiPatchPartType.OuterRing) ? MultiPatchPartType.InnerRing : MultiPatchPartType.Ring; while (++i < multipatch.Count && multipatch.GetPartType(i) == comparisonType) { polygonParts.Add(multipatch[i]); } temp = new PolygonShape(multipatch.RecordNumber, metadata, multipatch.Extent, polygonParts.ToArray()); (new Polygon(temp, m_document, m_color)).Write(); i--; break; } } }
public static void CollidePolygonAndCircle(out Manifold manifold, PolygonShape polygon, Transform xf1, CircleShape circle, Transform xf2) { var polyLock = polygon.Lock(); var circleLock = circle.Lock(); NativeMethods.cb2_collidepolygonandcircle(out manifold, polyLock, xf1, circleLock, xf2); polygon.Unlock(); circle.Unlock(); }
public static void CollidePolygons(out Manifold manifold, PolygonShape poly1, Transform xf1, PolygonShape poly2, Transform xf2) { var poly1Lock = poly1.Lock(); var poly2Lock = poly2.Lock(); NativeMethods.cb2_collidepolygons(out manifold, poly1Lock, xf1, poly2Lock, xf2); poly1.Unlock(); poly2.Unlock(); }
public static PolygonShape CreateEqlTriangle(float sideLength, float density) { FVector2[] pointList = new FVector2[3]; pointList[0] = new FVector2(0.0f, sideLength*0.25f*SR3); pointList[1] = new FVector2(sideLength*-0.5f, sideLength*-0.25f*SR3); pointList[2] = new FVector2(sideLength*0.5f, sideLength*-0.25f*SR3); PolygonShape shape = new PolygonShape(new Vertices(pointList), density); return shape; }
public Revolute() { System.Collections.Generic.List<JointDef> joints = new System.Collections.Generic.List<JointDef>(); Body ground = null; { BodyDef bd = new BodyDef(); ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); shape.Radius = 0.5f; BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; RevoluteJointDef rjd = new RevoluteJointDef(); bd.Position = new Vec2(0.0f, 20.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 5.0f); float w = 100.0f; body.AngularVelocity = w; body.LinearVelocity = new Vec2(-8.0f * w, 0.0f); rjd.Initialize(ground, body, new Vec2(0.0f, 12.0f)); rjd.MotorSpeed = 1.0f * (float)Math.PI; rjd.MaxMotorTorque = 10000.0f; rjd.EnableMotor = false; rjd.LowerAngle = -0.25f * (float)Math.PI; rjd.UpperAngle = 0.5f * (float)Math.PI; rjd.EnableLimit = true; rjd.CollideConnected = true; m_joint = (RevoluteJoint)m_world.CreateJoint(rjd); joints.Add(rjd); } using (System.IO.FileStream fs = new System.IO.FileStream("out.xml", System.IO.FileMode.Create)) { var serializer = Box2CS.Serialize.WorldSerializer.SerializeWorld(m_world, new Box2CS.Serialize.WorldXmlSerializer()); foreach (var j in joints) serializer.AddJoint(j); serializer.Serialize(fs); } }
public static PolygonShape CreateDiamond(float height, float width, float density) { if(height <= 0.0f || width <= 0.0f) { print ("INVALID SIZE VALUE FOR DIAMOND CLASS"); } FVector2[] pointList = new FVector2[4]; pointList[0] = new FVector2(0.0f, height/2.0f); pointList[1] = new FVector2(-width/2.0f, 0.0f); pointList[2] = new FVector2(0.0f, -height/2.0f); pointList[3] = new FVector2(width/2.0f, 0.0f); PolygonShape shape = new PolygonShape(new Vertices(pointList), density); return shape; }
public ContinuousTest() { { 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(-10.0f, 0.0f), new Vector2(10.0f, 0.0f)); body.CreateFixture(shape, 1.0f); shape.SetAsBox(0.2f, 1.0f, new Vector2(0.5f, 1.0f), 0.0f); body.CreateFixture(shape, 1.0f); } #if true { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.0f, 20.0f); //bd.angle = 0.1f; PolygonShape shape = new PolygonShape(); shape.SetAsBox(2.0f, 0.1f); _body = _world.CreateBody(bd); _body.CreateFixture(shape, 1.0f); Launch(); } #else { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.0f, 0.5f); Body body = _world.CreateBody(bd); CircleShape shape = new CircleShape(); shape._p = new Vector2Zero(); shape._radius = 0.5f; body.CreateFixture(shape, 1.0f); //bd.bullet = true; bd.position = new Vector2(0.0f, 10.0f); body = _world.CreateBody(bd); body.CreateFixture(shape, 1.0f); body.SetLinearVelocity(new Vector2(0.0f, -100.0f)); } #endif }
VerticalStack() { { BodyDef bd = new BodyDef(); Body 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); shape.SetAsEdge(new Vector2(20.0f, 0.0f), new Vector2(20.0f, 20.0f)); ground.CreateFixture(shape, 0.0f); } float[] xs = new float[5] {0.0f, -10.0f, -5.0f, 5.0f, 10.0f}; for (int j = 0; j < (int)StackOptions.e_columnCount; ++j) { 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 < (int)StackOptions.e_rowCount; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; int n = j * e_rowCount + i; Debug.Assert(n < e_rowCount * e_columnCount); _indices[n] = n; bd.userData = _indices[n]; float x = 0.0f; //float x = Rand.RandomFloat-0.02f, 0.02f); //float x = i % 2 == 0 ? -0.025f : 0.025f; bd.position = new Vector2(xs[j] + x, 0.752f + 1.54f * i); Body body = _world.CreateBody(bd); _bodies[n] = body; body.CreateFixture(fd); } } _bullet = null; }
public SensorTest() { { BodyDef bd = new BodyDef(); Body 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); } #if false { FixtureDef sd; sd.SetAsBox(10.0f, 2.0f, new Vector2(0.0f, 20.0f), 0.0f); sd.isSensor = true; _sensor = ground.CreateFixture(&sd); } #else { CircleShape shape = new CircleShape(); shape._radius = 5.0f; shape._p = new Vector2(0.0f, 10.0f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.isSensor = true; _sensor = ground.CreateFixture(fd); } #endif } { CircleShape shape = new CircleShape(); shape._radius = 1.0f; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-10.0f + 3.0f * i, 20.0f); bd.userData = i; _touching[i] = false; _bodies[i] = _world.CreateBody(bd); _bodies[i].CreateFixture(shape, 1.0f); } } }
public Confined() { { BodyDef bd = new BodyDef(); Body ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); // Floor shape.SetAsEdge(new Vector2(-10.0f, 0.0f), new Vector2(10.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); // Left wall shape.SetAsEdge(new Vector2(-10.0f, 0.0f), new Vector2(-10.0f, 20.0f)); ground.CreateFixture(shape, 0.0f); // Right wall shape.SetAsEdge(new Vector2(10.0f, 0.0f), new Vector2(10.0f, 20.0f)); ground.CreateFixture(shape, 0.0f); // Roof shape.SetAsEdge(new Vector2(-10.0f, 20.0f), new Vector2(10.0f, 20.0f)); ground.CreateFixture(shape, 0.0f); } float radius = 0.5f; CircleShape shape2 = new CircleShape(); shape2._p = Vector2.Zero; shape2._radius = radius; FixtureDef fd = new FixtureDef(); fd.shape = shape2; fd.density = 1.0f; fd.friction = 0.1f; for (int j = 0; j < e_columnCount; ++j) { for (int i = 0; i < e_rowCount; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-10.0f + (2.1f * j + 1.0f + 0.01f * i) * radius, (2.0f * i + 1.0f) * radius); Body body = _world.CreateBody(bd); body.CreateFixture(fd); } } _world.Gravity = new Vector2(0.0f, 0.0f); }
private static int GetFixedPointIndex(PolygonShape sourcePolygonShape, PointShape sourceControlPointShape) { var index = 0; for (var i = 0; i < sourcePolygonShape.OuterRing.Vertices.Count; i++) { var vertex = sourcePolygonShape.OuterRing.Vertices[i]; if (Math.Abs(vertex.X - sourceControlPointShape.X) > 10E-6 || Math.Abs(vertex.Y - sourceControlPointShape.Y) > 10E-6) continue; index = i; break; } int fixedPointIndex; if (index <= 2) fixedPointIndex = index + 2; else fixedPointIndex = index - 2; return fixedPointIndex; }
private void SetupPhysics() { if(body == null) { body = GetComponent<FSBodyComponent>().PhysicsBody; body.OnCollision += OnCollisionEvent; Vertices vertices = TriangleIsosceles.CreateVertexList(length, angle); FVector2 firstPoint = vertices.NextVertex(0); vertices.Translate(new FVector2(-firstPoint.X, -firstPoint.Y)); vertices.Rotate(Mathf.PI/180.0f * angle); PolygonShape polyTemp = new PolygonShape(vertices, 1.0f); body.CreateFixture(polyTemp); } }
public Polygon(PolygonShape type, bool computeUVs) { Shape = type; _computeUvs = computeUVs; Vertices = new Vector3[VertexCount]; TextureUVs = new Vector2[VertexCount]; if (_computeUvs) { TextureUVs[0] = new Vector2(0, 0); TextureUVs[1] = new Vector2(1, 0); TextureUVs[2] = new Vector2(1, 1); TextureUVs[3] = new Vector2(0, 0); TextureUVs[4] = new Vector2(1, 1); TextureUVs[5] = new Vector2(0, 1); } }
public Prismatic() { Body ground = null; { BodyDef bd = new BodyDef(); ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(2.0f, 0.5f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(-10.0f, 10.0f); bd.Angle = 0.5f * (float)Math.PI; bd.AllowSleep = false; Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 5.0f); PrismaticJointDef pjd = new PrismaticJointDef(); // Bouncy limit Vec2 axis = new Vec2(2.0f, 1.0f); axis.Normalize(); pjd.Initialize(ground, body, new Vec2(0.0f, 0.0f), axis); // Non-bouncy limit //pjd.Initialize(ground, body, new Vec2(-10.0f, 10.0f), new Vec2(1.0f, 0.0f)); pjd.MotorSpeed = 10.0f; pjd.MaxMotorForce = 10000.0f; pjd.EnableMotor = true; pjd.LowerTranslation = 0.0f; pjd.UpperTranslation = 20.0f; pjd.EnableLimit = false; m_joint = (PrismaticJoint)m_world.CreateJoint(pjd); } }
/// Main... public ElasticBody() { Program.MainForm.ViewZoom = 0.25f; /// Bottom static body { PolygonShape sd = new PolygonShape(); sd.SetAsBox(50.0f, 2.0f); BodyDef bd = new BodyDef(); bd.Position = new Vec2(-1.0f, -7.5f); m_ground = m_world.CreateBody(bd); m_ground.CreateFixture(new FixtureDef(sd, 0.0f, 0.1f, 0.1f)); } /// "Elastic body" 64 bodies - something like a lin. elastic compound /// connected via dynamic forces (springs) { PolygonShape sd = new PolygonShape(); sd.SetAsBox(width, height); FixtureDef sdf = new FixtureDef(); sdf.Density = 1.5f; sdf.Friction = 0.01f; sdf.Filter.GroupIndex = -1; sdf.Shape = sd; Vec2 startpoint = new Vec2(0, 0); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Bullet = false; //bd.AllowSleep = false; for (int i = 0; i < BodyCountY; ++i) { for (int j = 0; j < BodyCountX; ++j) { bd.Position = new Vec2(j*(width*2), 2.51f + (height*2) * i); bd.Position += startpoint; Body body = m_world.CreateBody(bd); bodies[BodyCountX*i+j] = body; body.CreateFixture(sdf); } } } }
public SensorTest() { { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); shape.Radius = 5.0f; shape.Position = new Vec2(0.0f, 10.0f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.IsSensor = true; m_sensor = ground.CreateFixture(fd); } } { CircleShape shape = new CircleShape(); for (int i = 0; i < e_count; ++i) { shape.Radius = Rand.RandomFloat(0.85f, 1.0f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(-10.0f + 3.0f * i, 20.0f); bd.UserData = i; m_touching[i] = false; m_bodies[i] = m_world.CreateBody(bd); m_bodies[i].CreateFixture(shape, 1.0f); } } }
/// <summary> /// Call this to initialize a Behaviour with data supplied in a file. /// </summary> /// <param name="fileName">The file to load from.</param> public override void LoadContent(String fileName) { base.LoadContent(fileName); Int32[] input = { 1, 7, 2, 2, 3, /**/ 15, 16, 14, 16, 17 }; mMapData = new List<Int32>(input); TileMapRenderDefinition def = GameObjectManager.pInstance.pContentManager.Load<TileMapRenderDefinition>(fileName); mTexture = GameObjectManager.pInstance.pContentManager.Load<Texture2D>(def.mSpriteFileName); mSourceWidth = 16; mSourceHeight = 16; mMapCountWidth = mTexture.Width / mSourceWidth; mMapCountHeight = mTexture.Height / mSourceHeight; var shape = new PolygonShape(); shape.SetAsBox(PhysicsManager.pInstance.ScreenToPhysicalWorld(mSourceWidth / 2 * 5), PhysicsManager.pInstance.ScreenToPhysicalWorld(mSourceHeight / 2 * 2)); var fd = new FixtureDef(); fd.shape = shape; fd.restitution = 0.0f; fd.friction = 0.5f; fd.density = 0.0f; BodyDef bd = new BodyDef(); mGround = PhysicsManager.pInstance.pWorld.CreateBody(bd); mGround.CreateFixture(fd); shape.SetAsBox(PhysicsManager.pInstance.ScreenToPhysicalWorld(mSourceWidth / 2 * 5), PhysicsManager.pInstance.ScreenToPhysicalWorld(mSourceHeight / 2 * 2), PhysicsManager.pInstance.ScreenToPhysicalWorld(new Vector2(mSourceWidth * -5, 0.0f)), 0.0f); fd = new FixtureDef(); fd.shape = shape; fd.restitution = 0.0f; fd.friction = 0.5f; fd.density = 0.0f; mGround.CreateFixture(fd); }
public OneSidedPlatform() { // Ground { BodyDef bd = new BodyDef(); Body ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-20.0f, 0.0f), new Vector2(20.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } // Platform { BodyDef bd = new BodyDef(); bd.position = new Vector2(0.0f, 10.0f); Body body = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsBox(3.0f, 0.5f); _platform = body.CreateFixture(shape, 0.0f); _bottom = 10.0f - 0.5f; _top = 10.0f + 0.5f; } // Actor { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.0f, 12.0f); Body body = _world.CreateBody(bd); _radius = 0.5f; CircleShape shape = new CircleShape(); shape._radius = _radius; _character = body.CreateFixture(shape, 20.0f); body.SetLinearVelocity(new Vector2(0.0f, -50.0f)); _state = State.e_unknown; } }
public Prismatic() { 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(2.0f, 0.5f); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-10.0f, 10.0f); bd.angle = 0.5f * (float)Settings.b2_pi; Body body = _world.CreateBody(bd); body.CreateFixture(shape, 5.0f); PrismaticJointDef pjd = new PrismaticJointDef(); // Bouncy limit Vector2 axis = new Vector2(2, 1); axis.Normalize(); pjd.Initialize(ground, body, new Vector2(0.0f, 0.0f), axis); // Non-bouncy limit //pjd.Initialize(ground, body, new Vector2(-10.0f, 10.0f), new Vector2(1.0f, 0.0f)); pjd.motorSpeed = 10.0f; pjd.maxMotorForce = 1000.0f; pjd.enableMotor = true; pjd.lowerTranslation = 0.0f; pjd.upperTranslation = 20.0f; pjd.enableLimit = true; _joint = (PrismaticJoint)_world.CreateJoint(pjd); } }
public Chain() { 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.6f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.friction = 0.2f; RevoluteJointDef jd = new RevoluteJointDef(); jd.collideConnected = false; float y = 25.0f; Body prevBody = ground; for (int i = 0; i < 30; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.5f + i, y); Body body = _world.CreateBody(bd); body.CreateFixture(fd); Vector2 anchor = new Vector2((float)i, y); jd.Initialize(prevBody, body, anchor); _world.CreateJoint(jd); prevBody = body; } } }
Pulleys() { 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); } { float a = 2.0f; float b = 4.0f; float y = 16.0f; float L = 12.0f; PolygonShape shape = new PolygonShape(); shape.SetAsBox(a, b); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-10.0f, y); Body body1 = _world.CreateBody(bd); body1.CreateFixture(shape, 5.0f); bd.position = new Vector2(10.0f, y); Body body2 = _world.CreateBody(bd); body2.CreateFixture(shape, 5.0f); PulleyJointDef pulleyDef = new PulleyJointDef(); Vector2 anchor1 = new Vector2(-10.0f, y + b); Vector2 anchor2 = new Vector2(10.0f, y + b); Vector2 groundAnchor1 = new Vector2(-10.0f, y + b + L); Vector2 groundAnchor2 = new Vector2(10.0f, y + b + L); pulleyDef.Initialize(body1, body2, groundAnchor1, groundAnchor2, anchor1, anchor2, 2.0f); _joint1 = (PulleyJoint)_world.CreateJoint(pulleyDef); } }
public Body[] GenerateBodies(World world, Vec2 basePosition, FixtureDef def) { if (_vecs.Count <= 1) throw new ArgumentOutOfRangeException("Vecs"); Body[] bodies = new Body[_vecs.Count - 1]; for (int i = 0; i < _vecs.Count - 1; ++i) { PolygonShape edge = new PolygonShape(_vecs[i], _vecs[i + 1]); BodyDef bd = new BodyDef(); bd.Position = basePosition; bodies[i] = world.CreateBody(bd); bodies[i].CreateFixture(new FixtureDef(edge, 0, def.Restitution, def.Friction, false, def.UserData)); } return bodies; }
private void Start() { // 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); Single angle = 0.0f; Single delta = Settings.Pi / 3.0f; var vertices = new Vector2[6]; for (var i = 0; i < 6; ++i) { vertices[i].Set(0.5f * (Single)Math.Cos(angle), 0.5f * (Single)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); } DrawString("This tests various character collision shapes."); DrawString("Limitation: square and hexagon can snag on aligned boxes."); DrawString("Feature: edge chains have smooth collision inside and out."); }
private BodyTypesTest() { //Ground BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); // Define attachment { _attachment = BodyFactory.CreateBody(World); _attachment.BodyType = BodyType.Dynamic; _attachment.Position = new Vector2(0.0f, 3.0f); Vertices box = PolygonTools.CreateRectangle(0.5f, 2.0f); PolygonShape shape = new PolygonShape(box, 2); _attachment.CreateFixture(shape); } // Define platform { _platform = BodyFactory.CreateBody(World); _platform.BodyType = BodyType.Dynamic; _platform.Position = new Vector2(0.0f, 5.0f); Vertices box = PolygonTools.CreateRectangle(4.0f, 0.5f); PolygonShape shape = new PolygonShape(box, 2); Fixture fixture = _platform.CreateFixture(shape); fixture.Friction = 0.6f; RevoluteJoint rjd = new RevoluteJoint(_attachment, _platform, _attachment.GetLocalPoint(_platform.Position), Vector2.Zero); rjd.MaxMotorTorque = 50.0f; rjd.MotorEnabled = true; World.AddJoint(rjd); //FixedPrismaticJoint pjd = new FixedPrismaticJoint(_platform, new Vector2(0.0f, 5.0f), // new Vector2(1.0f, 0.0f)); //pjd.MaxMotorForce = 1000.0f; //pjd.MotorEnabled = true; //pjd.LowerLimit = -10.0f; //pjd.UpperLimit = 10.0f; //pjd.LimitEnabled = true; //World.AddJoint(pjd); _speed = 3.0f; } // Create a payload { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(0.0f, 8.0f); Vertices box = PolygonTools.CreateRectangle(0.75f, 0.75f); PolygonShape shape = new PolygonShape(box, 2); Fixture fixture = body.CreateFixture(shape); fixture.Friction = 0.6f; } }
public TheoJansen() { _offset.Set(0.0f, 8.0f); _motorSpeed = 2.0f; _motorOn = true; var pivot = new Vector2(0.0f, 0.8f); // Ground { var bd = new BodyDef(); var ground = World.CreateBody(bd); var shape = new EdgeShape(); shape.SetTwoSided(new Vector2(-50.0f, 0.0f), new Vector2(50.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); shape.SetTwoSided(new Vector2(-50.0f, 0.0f), new Vector2(-50.0f, 10.0f)); ground.CreateFixture(shape, 0.0f); shape.SetTwoSided(new Vector2(50.0f, 0.0f), new Vector2(50.0f, 10.0f)); ground.CreateFixture(shape, 0.0f); } // Balls for (var i = 0; i < 40; ++i) { var shape = new CircleShape(); shape.Radius = 0.25f; var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(-40.0f + 2.0f * i, 0.5f); var body = World.CreateBody(bd); body.CreateFixture(shape, 1.0f); } // Chassis { var shape = new PolygonShape(); shape.SetAsBox(2.5f, 1.0f); var sd = new FixtureDef(); sd.Density = 1.0f; sd.Shape = shape; sd.Filter.GroupIndex = -1; var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position = pivot + _offset; _chassis = World.CreateBody(bd); _chassis.CreateFixture(sd); } { var shape = new CircleShape(); shape.Radius = 1.6f; var sd = new FixtureDef(); sd.Density = 1.0f; sd.Shape = shape; sd.Filter.GroupIndex = -1; var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position = pivot + _offset; _wheel = World.CreateBody(bd); _wheel.CreateFixture(sd); } { var jd = new RevoluteJointDef(); jd.Initialize(_wheel, _chassis, pivot + _offset); jd.CollideConnected = false; jd.MotorSpeed = _motorSpeed; jd.MaxMotorTorque = 400.0f; jd.EnableMotor = _motorOn; _motorJoint = (RevoluteJoint)World.CreateJoint(jd); } Vector2 wheelAnchor; wheelAnchor = pivot + new Vector2(0.0f, -0.8f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); _wheel.SetTransform(_wheel.GetPosition(), 120.0f * (float)Math.PI / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); _wheel.SetTransform(_wheel.GetPosition(), -120.0f * (float)Math.PI / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); }
public CharacterCollision() { // Ground body { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); EdgeShape shape = new EdgeShape(); shape.Set(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f)); shape.Density = 0; ground.CreateFixture(shape); } // Collinear edges with no adjacency information. // This shows the problematic case where a box shape can hit // an internal vertex. { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); EdgeShape shape = new EdgeShape(); shape.Density = 0; shape.Set(new Vec2(-8.0f, 1.0f), new Vec2(-6.0f, 1.0f)); ground.CreateFixture(shape); shape.Set(new Vec2(-6.0f, 1.0f), new Vec2(-4.0f, 1.0f)); ground.CreateFixture(shape); shape.Set(new Vec2(-4.0f, 1.0f), new Vec2(-2.0f, 1.0f)); ground.CreateFixture(shape); } // Chain shape { BodyDef bd = new BodyDef(); bd.angle = 0.25f * (float)Math.PI; Body ground = m_world.CreateBody(bd); Vec2[] vs = new Vec2[4]; vs[0].Set(5.0f, 7.0f); vs[1].Set(6.0f, 8.0f); vs[2].Set(7.0f, 8.0f); vs[3].Set(8.0f, 7.0f); ChainShape shape = new ChainShape(); shape.CreateChain(vs, 4); shape.Density = 0; ground.CreateFixture(shape); } // Square tiles. This shows that adjacency shapes may // have non-smooth collision. There is no solution // to this problem. { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.Density = 0; shape.SetAsBox(1.0f, 1.0f, new Vec2(4.0f, 3.0f), 0.0f); ground.CreateFixture(shape); shape.SetAsBox(1.0f, 1.0f, new Vec2(6.0f, 3.0f), 0.0f); ground.CreateFixture(shape); shape.SetAsBox(1.0f, 1.0f, new Vec2(8.0f, 3.0f), 0.0f); ground.CreateFixture(shape); } // Square made from an edge loop. Collision should be smooth. { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); Vec2[] vs = new Vec2[4]; vs[0].Set(-1.0f, 3.0f); vs[1].Set(1.0f, 3.0f); vs[2].Set(1.0f, 5.0f); vs[3].Set(-1.0f, 5.0f); ChainShape shape = new ChainShape(); shape.CreateLoop(vs, 4); shape.Density = 0; ground.CreateFixture(shape); } // Edge loop. Collision should be smooth. { BodyDef bd = new BodyDef(); bd.Position.Set(-10.0f, 4.0f); Body ground = m_world.CreateBody(bd); Vec2[] vs = new Vec2[10]; vs[0].Set(0.0f, 0.0f); vs[1].Set(6.0f, 0.0f); vs[2].Set(6.0f, 2.0f); vs[3].Set(4.0f, 1.0f); vs[4].Set(2.0f, 2.0f); vs[5].Set(0.0f, 2.0f); vs[6].Set(-2.0f, 2.0f); vs[7].Set(-4.0f, 3.0f); vs[8].Set(-6.0f, 2.0f); vs[9].Set(-6.0f, 0.0f); ChainShape shape = new ChainShape(); shape.CreateLoop(vs, 10); shape.Density = 0; ground.CreateFixture(shape); } // Square character 1 { BodyDef bd = new BodyDef(); bd.Position.Set(-3.0f, 8.0f); bd.type = BodyType._dynamicBody; bd.fixedRotation = true; bd.allowSleep = false; Body body = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.5f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 20.0f; body.CreateFixture(fd); } // Square character 2 { BodyDef bd = new BodyDef(); bd.Position.Set(-5.0f, 5.0f); bd.type = BodyType._dynamicBody; bd.fixedRotation = true; bd.allowSleep = false; Body body = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.25f, 0.25f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 20.0f; body.CreateFixture(fd); } // Hexagon character { BodyDef bd = new BodyDef(); bd.Position.Set(-5.0f, 8.0f); bd.type = BodyType._dynamicBody; bd.fixedRotation = true; bd.allowSleep = false; Body body = m_world.CreateBody(bd); float angle = 0.0f; float delta = (float)Math.PI / 3.0f; Vec2[] vertices = new Vec2[6]; for (int i = 0; i < 6; ++i) { vertices[i].Set(0.5f * (float)Math.Cos(angle), 0.5f * (float)Math.Sin(angle)); angle += delta; } PolygonShape shape = new PolygonShape(); shape.Set(vertices, 6); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 20.0f; body.CreateFixture(fd); } // Circle character { BodyDef bd = new BodyDef(); bd.Position.Set(3.0f, 5.0f); bd.type = BodyType._dynamicBody; bd.fixedRotation = true; bd.allowSleep = false; Body body = m_world.CreateBody(bd); CircleShape shape = new CircleShape(); shape.m_radius = 0.5f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 20.0f; body.CreateFixture(fd); } // Circle character { BodyDef bd = new BodyDef(); bd.Position.Set(-7.0f, 6.0f); bd.type = BodyType._dynamicBody; bd.allowSleep = false; m_character = m_world.CreateBody(bd); CircleShape shape = new CircleShape(); shape.m_radius = 0.25f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 20.0f; fd.friction = 1.0f; m_character.CreateFixture(fd); } }
public void Create(BroadPhase broadPhase, Body body, XForm 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); _proxyId = inRange ? broadPhase.CreateProxy(aabb, this) : PairManager.NullProxy; }
public SliderCrank2() { 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 prevBody = ground; // Define crank. { var shape = new PolygonShape(); shape.SetAsBox(0.5f, 2.0f); var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position = new Vector2(0.0f, 7.0f); var body = World.CreateBody(bd); body.CreateFixture(shape, 2.0f); var rjd = new RevoluteJointDef(); rjd.Initialize(prevBody, body, new Vector2(0.0f, 5.0f)); rjd.MotorSpeed = 1.0f * Settings.Pi; rjd.MaxMotorTorque = 10000.0f; rjd.EnableMotor = true; _joint1 = (RevoluteJoint)World.CreateJoint(rjd); prevBody = body; } // Define follower. { var shape = new PolygonShape(); shape.SetAsBox(0.5f, 4.0f); var bd = new BodyDef { BodyType = BodyType.DynamicBody, Position = new Vector2(0.0f, 13.0f) }; var body = World.CreateBody(bd); body.CreateFixture(shape, 2.0f); var rjd = new RevoluteJointDef(); rjd.Initialize(prevBody, body, new Vector2(0.0f, 9.0f)); rjd.EnableMotor = false; World.CreateJoint(rjd); prevBody = body; } // Define piston { var shape = new PolygonShape(); shape.SetAsBox(1.5f, 1.5f); var bd = new BodyDef { BodyType = BodyType.DynamicBody, FixedRotation = true, Position = new Vector2(0.0f, 17.0f) }; var body = World.CreateBody(bd); body.CreateFixture(shape, 2.0f); var rjd = new RevoluteJointDef(); rjd.Initialize(prevBody, body, new Vector2(0.0f, 17.0f)); World.CreateJoint(rjd); var pjd = new PrismaticJointDef(); pjd.Initialize(ground, body, new Vector2(0.0f, 17.0f), new Vector2(0.0f, 1.0f)); pjd.MaxMotorForce = 1000.0f; pjd.EnableMotor = true; _joint2 = (PrismaticJoint)World.CreateJoint(pjd); } // Create a payload { var shape = new PolygonShape(); shape.SetAsBox(1.5f, 1.5f); var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position = new Vector2(0.0f, 23.0f); var body = World.CreateBody(bd); body.CreateFixture(shape, 2.0f); } } }
private CarTest() { _hz = 4.0f; _zeta = 0.7f; _speed = 50.0f; Body ground = new Body(World); { EdgeShape shape = new EdgeShape(new Vector2(-20.0f, 0.0f), new Vector2(20.0f, 0.0f)); ground.CreateFixture(shape); float[] hs = new[] { 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; const float dx = 5.0f; for (int i = 0; i < 10; ++i) { float y2 = hs[i]; FixtureFactory.AttachEdge(new Vector2(x, y1), new Vector2(x + dx, y2), ground); y1 = y2; x += dx; } for (int i = 0; i < 10; ++i) { float y2 = hs[i]; FixtureFactory.AttachEdge(new Vector2(x, y1), new Vector2(x + dx, y2), ground); y1 = y2; x += dx; } FixtureFactory.AttachEdge(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f), ground); x += 80.0f; FixtureFactory.AttachEdge(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f), ground); x += 40.0f; FixtureFactory.AttachEdge(new Vector2(x, 0.0f), new Vector2(x + 10.0f, 5.0f), ground); x += 20.0f; FixtureFactory.AttachEdge(new Vector2(x, 0.0f), new Vector2(x + 40.0f, 0.0f), ground); x += 40.0f; FixtureFactory.AttachEdge(new Vector2(x, 0.0f), new Vector2(x, 20.0f), ground); ground.Friction = 0.6f; } // Teeter { Body body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(140.0f, 1.0f); PolygonShape box = new PolygonShape(1); box.SetAsBox(10.0f, 0.25f); body.CreateFixture(box); RevoluteJoint jd = JointFactory.CreateRevoluteJoint(ground, body, Vector2.Zero); jd.LowerLimit = -8.0f * Settings.Pi / 180.0f; jd.UpperLimit = 8.0f * Settings.Pi / 180.0f; jd.LimitEnabled = true; World.AddJoint(jd); body.ApplyAngularImpulse(100.0f); } //Bridge { const int N = 20; PolygonShape shape = new PolygonShape(1); shape.SetAsBox(1.0f, 0.125f); Body prevBody = ground; for (int i = 0; i < N; ++i) { Body body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(161.0f + 2.0f * i, -0.125f); Fixture fix = body.CreateFixture(shape); fix.Friction = 0.6f; Vector2 anchor = new Vector2(-1, 0); JointFactory.CreateRevoluteJoint(World, prevBody, body, anchor); prevBody = body; } Vector2 anchor2 = new Vector2(1.0f, 0); JointFactory.CreateRevoluteJoint(World, ground, prevBody, anchor2); } // Boxes { PolygonShape box = new PolygonShape(0.5f); box.SetAsBox(0.5f, 0.5f); Body body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0f, 0.5f); body.CreateFixture(box); body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0f, 1.5f); body.CreateFixture(box); body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0f, 2.5f); body.CreateFixture(box); body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0f, 3.5f); body.CreateFixture(box); body = new Body(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(230.0f, 4.5f); body.CreateFixture(box); } // Car { Vertices vertices = new Vertices(8); vertices.Add(new Vector2(-1.5f, -0.5f)); vertices.Add(new Vector2(1.5f, -0.5f)); vertices.Add(new Vector2(1.5f, 0.0f)); vertices.Add(new Vector2(0.0f, 0.9f)); vertices.Add(new Vector2(-1.15f, 0.9f)); vertices.Add(new Vector2(-1.5f, 0.2f)); PolygonShape chassis = new PolygonShape(vertices, 1); CircleShape circle = new CircleShape(0.4f, 1); _car = new Body(World); _car.BodyType = BodyType.Dynamic; _car.Position = new Vector2(0.0f, 1.0f); _car.CreateFixture(chassis); _wheel1 = new Body(World); _wheel1.BodyType = BodyType.Dynamic; _wheel1.Position = new Vector2(-1.0f, 0.35f); Fixture fix = _wheel1.CreateFixture(circle); fix.Friction = 0.9f; _wheel2 = new Body(World); _wheel2.BodyType = BodyType.Dynamic; _wheel2.Position = new Vector2(1.0f, 0.4f); _wheel2.CreateFixture(circle); Vector2 axis = new Vector2(0.0f, 1.0f); _spring1 = new LineJoint(_car, _wheel1, _wheel1.Position, axis); _spring1.MotorSpeed = 0.0f; _spring1.MaxMotorTorque = 20.0f; _spring1.MotorEnabled = true; _spring1.Frequency = _hz; _spring1.DampingRatio = _zeta; World.AddJoint(_spring1); _spring2 = new LineJoint(_car, _wheel2, _wheel2.Position, axis); _spring2.MotorSpeed = 0.0f; _spring2.MaxMotorTorque = 10.0f; _spring2.MotorEnabled = false; _spring2.Frequency = _hz; _spring2.DampingRatio = _zeta; World.AddJoint(_spring2); } }
public override void Initialize() { Settings.VelocityIterations = 2; Settings.PositionIterations = 4; GameInstance.ViewCenter = Vector2.Zero; _worldSize = 2 * GameInstance.ConvertScreenToWorld(GameInstance.Window.ClientBounds.Width, 0); //Create a World using QuadTree constructor var worldSpan = new AABB(-_worldSize / 2, _worldSize / 2); World = new World(new QuadTreeBroadPhase(worldSpan)); //Create a World using DynamicTree constructor //World = new World(); // //set up gravity // World.Gravity = new Vector2(0.0f, -10.0f); // //set up border // float halfWidth = _worldSize.X / 2 - 2f; float halfHeight = _worldSize.Y / 2 - 2f; Vertices borders = new Vertices(4); borders.Add(new Vector2(-halfWidth, halfHeight)); borders.Add(new Vector2(halfWidth, halfHeight)); borders.Add(new Vector2(halfWidth, -halfHeight)); borders.Add(new Vector2(-halfWidth, -halfHeight)); Body anchor = World.CreateLoopShape(borders); anchor.SetCollisionCategories(Category.All); anchor.SetCollidesWith(Category.All); // //box // Vertices bigbox = PolygonTools.CreateRectangle(3f, 3f); PolygonShape bigshape = new PolygonShape(bigbox, 5); Body bigbody = World.CreateBody(); bigbody.BodyType = BodyType.Dynamic; bigbody.Position = Vector2.UnitX * 25; bigbody.CreateFixture(bigshape); World.Remove(bigbody); // //populate // const int rad = 12; const float a = 0.6f; const float sep = 0.000f; Vector2 cent = Vector2.Zero; for (int y = -rad; y <= +rad; y++) { int xrad = (int)Math.Round(Math.Sqrt(rad * rad - y * y)); for (int x = -xrad; x <= +xrad; x++) { Vector2 pos = cent + new Vector2(x * (2 * a + sep), y * (2 * a + sep)); Body cBody = World.CreateCircle(a, 55, pos); cBody.BodyType = BodyType.Dynamic; } } base.Initialize(); }
public RayCast() { // Ground body { BodyDef bd = new BodyDef(); Body 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); } { var 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); _polygons[0] = new PolygonShape(); _polygons[0].Set(vertices, 3); } { var vertices2 = new Vector2[3]; vertices2[0] = new Vector2(-0.1f, 0.0f); vertices2[1] = new Vector2(0.1f, 0.0f); vertices2[2] = new Vector2(0.0f, 1.5f); _polygons[1] = new PolygonShape(); _polygons[1].Set(vertices2, 3); } { float w = 1.0f; float b = w / (2.0f + (float)Math.Sqrt(2.0)); float s = (float)Math.Sqrt(2.0) * b; var vertices3 = new Vector2[8]; vertices3[0] = new Vector2(0.5f * s, 0.0f); vertices3[1] = new Vector2(0.5f * w, b); vertices3[2] = new Vector2(0.5f * w, b + s); vertices3[3] = new Vector2(0.5f * s, w); vertices3[4] = new Vector2(-0.5f * s, w); vertices3[5] = new Vector2(-0.5f * w, b + s); vertices3[6] = new Vector2(-0.5f * w, b); vertices3[7] = new Vector2(-0.5f * s, 0.0f); _polygons[2] = new PolygonShape(); _polygons[2].Set(vertices3, 8); } { _polygons[3] = new PolygonShape(); _polygons[3].SetAsBox(0.5f, 0.5f); } { _circle = new CircleShape(); _circle._radius = 0.5f; } _bodyIndex = 0; _angle = 0.0f; _mode = RayCastMode.Closest; }
//Cutting a shape into two is based on the work of Daid and his prototype BoxCutter: http://www.box2d.org/forum/viewtopic.php?f=3&t=1473 /// <summary> /// Split a fixture into 2 vertice collections using the given entry and exit-point. /// </summary> /// <param name="fixture">The Fixture to split</param> /// <param name="entryPoint">The entry point - The start point</param> /// <param name="exitPoint">The exit point - The end point</param> /// <param name="first">The first collection of vertexes</param> /// <param name="second">The second collection of vertexes</param> public static void SplitShape(Fixture fixture, Vector2 entryPoint, Vector2 exitPoint, out Vertices first, out Vertices second) { Vector2 localEntryPoint = fixture.Body.GetLocalPoint(ref entryPoint); Vector2 localExitPoint = fixture.Body.GetLocalPoint(ref exitPoint); PolygonShape shape = fixture.Shape as PolygonShape; //We can only cut polygons at the moment if (shape == null) { first = new Vertices(); second = new Vertices(); return; } //Offset the entry and exit points if they are too close to the vertices foreach (Vector2 vertex in shape.Vertices) { if (vertex.Equals(localEntryPoint)) { localEntryPoint -= new Vector2(0, Settings.Epsilon); } if (vertex.Equals(localExitPoint)) { localExitPoint += new Vector2(0, Settings.Epsilon); } } Vertices vertices = new Vertices(shape.Vertices); Vertices[] newPolygon = new Vertices[2]; for (int i = 0; i < newPolygon.Length; i++) { newPolygon[i] = new Vertices(vertices.Count); } int[] cutAdded = { -1, -1 }; int last = -1; for (int i = 0; i < vertices.Count; i++) { int n; //Find out if this vertex is on the old or new shape. if (Vector2.Dot(MathUtils.Cross(localExitPoint - localEntryPoint, 1), vertices[i] - localEntryPoint) > Settings.Epsilon) { n = 0; } else { n = 1; } if (last != n) { //If we switch from one shape to the other add the cut vertices. if (last == 0) { Debug.Assert(cutAdded[0] == -1); cutAdded[0] = newPolygon[last].Count; newPolygon[last].Add(localExitPoint); newPolygon[last].Add(localEntryPoint); } if (last == 1) { Debug.Assert(cutAdded[last] == -1); cutAdded[last] = newPolygon[last].Count; newPolygon[last].Add(localEntryPoint); newPolygon[last].Add(localExitPoint); } } newPolygon[n].Add(vertices[i]); last = n; } //Add the cut in case it has not been added yet. if (cutAdded[0] == -1) { cutAdded[0] = newPolygon[0].Count; newPolygon[0].Add(localExitPoint); newPolygon[0].Add(localEntryPoint); } if (cutAdded[1] == -1) { cutAdded[1] = newPolygon[1].Count; newPolygon[1].Add(localEntryPoint); newPolygon[1].Add(localExitPoint); } for (int n = 0; n < 2; n++) { Vector2 offset; if (cutAdded[n] > 0) { offset = (newPolygon[n][cutAdded[n] - 1] - newPolygon[n][cutAdded[n]]); } else { offset = (newPolygon[n][newPolygon[n].Count - 1] - newPolygon[n][0]); } offset = Vector2.Normalize(offset); if (!offset.IsValid()) { offset = Vector2.One; } newPolygon[n][cutAdded[n]] += Settings.Epsilon * offset; if (cutAdded[n] < newPolygon[n].Count - 2) { offset = (newPolygon[n][cutAdded[n] + 2] - newPolygon[n][cutAdded[n] + 1]); } else { offset = (newPolygon[n][0] - newPolygon[n][newPolygon[n].Count - 1]); } offset = Vector2.Normalize(offset); if (!offset.IsValid()) { offset = Vector2.One; } newPolygon[n][cutAdded[n] + 1] += Settings.Epsilon * offset; } first = newPolygon[0]; second = newPolygon[1]; }
//private void SetupAnimationForOverlay(LayerOverlay overlay) //{ // overlay.Drawing -= overlay_Drawing; // overlay.Drawing += overlay_Drawing; // overlay.Drawn -= overlay_Drawn; // overlay.Drawn += overlay_Drawn; //} private void WpfMap_MapClick(object sender, MapClickWpfMapEventArgs e) { if (isIdentify) { PointShape point = e.WorldLocation; if (!map.Overlays.Contains(chartsOverlayName)) { return; } LayerOverlay overlay = map.Overlays[chartsOverlayName] as LayerOverlay; var features = new Collection <Feature>(); NauticalChartsFeatureLayer hydrographyFeatureLayer = null; foreach (var item in overlay.Layers) { NauticalChartsFeatureLayer itemLayer = item as NauticalChartsFeatureLayer; itemLayer.Open(); features = itemLayer.QueryTools.GetFeaturesIntersecting(point.GetBoundingBox(), ReturningColumnsType.AllColumns); if (features.Count > 0) { hydrographyFeatureLayer = itemLayer; break; } } if (features.Count > 0) { List <FeatureInfo> selectedFeatures = new List <FeatureInfo>(); foreach (var item in features) { double area = double.MaxValue; PolygonShape areaShape = item.GetShape() as PolygonShape; if (areaShape != null) { area = areaShape.GetArea(map.MapUnit, AreaUnit.SquareMeters); } selectedFeatures.Add(new FeatureInfo(item, hydrographyFeatureLayer.Name, area)); } if (map.Overlays.Contains(highlightOverlayName)) { map.Overlays.Remove(highlightOverlayName); } IEnumerable <FeatureInfo> featureInfos = selectedFeatures.OrderBy(p => p.Area); SelectedFeatureInfo = featureInfos.FirstOrDefault(); NauticalChartsFeatureSource featureSource = hydrographyFeatureLayer.FeatureSource as NauticalChartsFeatureSource; if (featureSource != null) { ChartSelectedItem = new ChartSelectedItem(featureSource.NauticalChartsPathFilename, featureInfos); } } else { if (map.Overlays.Contains(highlightOverlayName)) { map.Overlays.Remove(highlightOverlayName); } map.Refresh(); } } }
public Logic() { polygon = new PolygonShape(); polygonCollection = new ObservableCollection <PolygonShape>(); }
private BridgeTest() { Body ground; { ground = new Body(World); EdgeShape shape = new EdgeShape(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.CreateFixture(shape); } { Vertices box = PolygonTools.CreateRectangle(0.5f, 0.125f); PolygonShape shape = new PolygonShape(box, 20); Body prevBody = ground; for (int i = 0; i < Count; ++i) { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-14.5f + 1.0f * i, 5.0f); Fixture fixture = body.CreateFixture(shape); fixture.Friction = 0.2f; Vector2 anchor = new Vector2(-0.5f, 0.0f); RevoluteJoint jd = new RevoluteJoint(prevBody, body, prevBody.GetLocalPoint(body.GetWorldPoint(anchor)), anchor); World.AddJoint(jd); prevBody = body; } Vector2 anchor2 = new Vector2(0.5f, 0.0f); RevoluteJoint jd2 = new RevoluteJoint(ground, prevBody, ground.GetLocalPoint(prevBody.GetWorldPoint(anchor2)), anchor2); World.AddJoint(jd2); } Vertices vertices = new Vertices(3); vertices.Add(new Vector2(-0.5f, 0.0f)); vertices.Add(new Vector2(0.5f, 0.0f)); vertices.Add(new Vector2(0.0f, 1.5f)); for (int i = 0; i < 2; ++i) { PolygonShape shape = new PolygonShape(vertices, 1); Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-8.0f + 8.0f * i, 12.0f); body.CreateFixture(shape); } for (int i = 0; i < 3; ++i) { CircleShape shape = new CircleShape(0.5f, 1); Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-6.0f + 6.0f * i, 10.0f); body.CreateFixture(shape); } }
private DominosTest() { Body b1 = BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); { Vertices box = PolygonUtils.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 = PolygonUtils.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 = PolygonUtils.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 = PolygonUtils.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 = PolygonUtils.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); RevoluteJoint jd = new RevoluteJoint(b1, b3, anchor, true); jd.CollideConnected = true; World.AddJoint(jd); Body b4; { Vertices box = PolygonUtils.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); RevoluteJoint jd2 = new RevoluteJoint(b2, b4, anchor, true); World.AddJoint(jd2); Body b5; { b5 = BodyFactory.CreateBody(World); b5.BodyType = BodyType.Dynamic; b5.Position = new Vector2(6.5f, 3.0f); Vertices vertices = PolygonUtils.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 = PolygonUtils.CreateRectangle(0.1f, 1.0f, new Vector2(-0.9f, 0.0f), 0.0f); shape.Vertices = vertices; fix = b5.CreateFixture(shape); fix.Friction = 0.1f; vertices = PolygonUtils.CreateRectangle(0.1f, 1.0f, new Vector2(0.9f, 0.0f), 0.0f); shape.Vertices = vertices; fix = b5.CreateFixture(shape); fix.Friction = 0.1f; } anchor = new Vector2(6.0f, 2.0f); RevoluteJoint jd3 = new RevoluteJoint(b1, b5, anchor, true); World.AddJoint(jd3); Body b6; { Vertices box = PolygonUtils.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(7.50f, 4.0f); RevoluteJoint jd4 = new RevoluteJoint(b5, b6, anchor, true); jd4.CollideConnected = true; World.AddJoint(jd4); Body b7; { Vertices box = PolygonUtils.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)); 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; } } }
private VaryingFrictionTest() { //Ground BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); { Vertices box = PolygonTools.CreateRectangle(13.0f, 0.25f); PolygonShape shape = new PolygonShape(box, 0); Body ground = BodyFactory.CreateBody(World); ground.Position = new Vector2(-4.0f, 22.0f); ground.Rotation = -0.25f; ground.CreateFixture(shape); } { Vertices box = PolygonTools.CreateRectangle(0.25f, 1.0f); PolygonShape shape = new PolygonShape(box, 0); Body ground = BodyFactory.CreateBody(World); ground.Position = new Vector2(10.5f, 19.0f); ground.CreateFixture(shape); } { Vertices box = PolygonTools.CreateRectangle(13.0f, 0.25f); PolygonShape shape = new PolygonShape(box, 0); Body ground = BodyFactory.CreateBody(World); ground.Position = new Vector2(4.0f, 14.0f); ground.Rotation = 0.25f; ground.CreateFixture(shape); } { Vertices box = PolygonTools.CreateRectangle(0.25f, 1.0f); PolygonShape shape = new PolygonShape(box, 0); Body ground = BodyFactory.CreateBody(World); ground.Position = new Vector2(-10.5f, 11.0f); ground.CreateFixture(shape); } { Vertices box = PolygonTools.CreateRectangle(13f, 0.25f); PolygonShape shape = new PolygonShape(box, 0); Body ground = BodyFactory.CreateBody(World); ground.Position = new Vector2(-4.0f, 6.0f); ground.Rotation = -0.25f; ground.CreateFixture(shape); } { Vertices box = PolygonTools.CreateRectangle(0.5f, 0.5f); PolygonShape shape = new PolygonShape(box, 25); float[] friction = new[] { 0.75f, 0.5f, 0.35f, 0.1f, 0.0f }; for (int i = 0; i < 5; ++i) { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-15.0f + 4.0f * i, 28.0f); Fixture fixture = body.CreateFixture(shape); fixture.Friction = friction[i]; } } }
/// <summary> /// This makes the explosive explode /// </summary> /// <param name="pos"> /// The position where the explosion happens /// </param> /// <param name="radius"> /// The explosion radius /// </param> /// <param name="maxForce"> /// The explosion force at the explosion point /// (then is inversely proportional to the square of the distance) /// </param> /// <returns> /// A dictionnary containing all the "exploded" fixtures /// with a list of the applied impulses /// </returns> public Dictionary <Fixture, List <Vector2> > Activate(Vector2 pos, float radius, float maxForce) { _exploded.Clear(); AABB aabb; aabb.LowerBound = pos + new Vector2(-radius, -radius); aabb.UpperBound = pos + new Vector2(radius, radius); Fixture[] shapes = new Fixture[MaxShapes]; // More than 5 shapes in an explosion could be possible, but still strange. Fixture[] containedShapes = new Fixture[5]; bool exit = false; int shapeCount = 0; int containedShapeCount = 0; // Query the world for overlapping shapes. World.QueryAABB( fixture => { if (fixture.TestPoint(ref pos)) { if (IgnoreWhenInsideShape) { exit = true; } else { containedShapes[containedShapeCount++] = fixture; } } else { if (shapeCount < MaxShapes) { shapes[shapeCount++] = fixture; } } // Continue the query. return(true); }, ref aabb); if (exit) { return(_exploded); } // Per shape max/min angles for now. float[] vals = new float[shapeCount * 2]; int valIndex = 0; for (int i = 0; i < shapeCount; ++i) { PolygonShape ps; CircleShape cs = shapes[i].Shape as CircleShape; if (cs != null) { // We create a "diamond" approximation of the circle Vertices v = new Vertices(); Vector2 vec = Vector2.Zero + new Vector2(cs.Radius, 0); v.Add(vec); vec = Vector2.Zero + new Vector2(0, cs.Radius); v.Add(vec); vec = Vector2.Zero + new Vector2(-cs.Radius, cs.Radius); v.Add(vec); vec = Vector2.Zero + new Vector2(0, -cs.Radius); v.Add(vec); ps = new PolygonShape(v, 0); } else { ps = shapes[i].Shape as PolygonShape; } if ((shapes[i].Body.BodyType == BodyType.Dynamic) && ps != null) { Vector2 toCentroid = shapes[i].Body.GetWorldPoint(ps.MassData.Centroid) - pos; float angleToCentroid = (float)Math.Atan2(toCentroid.Y, toCentroid.X); float min = float.MaxValue; float max = float.MinValue; float minAbsolute = 0.0f; float maxAbsolute = 0.0f; for (int j = 0; j < (ps.Vertices.Count()); ++j) { Vector2 toVertex = (shapes[i].Body.GetWorldPoint(ps.Vertices[j]) - pos); float newAngle = (float)Math.Atan2(toVertex.Y, toVertex.X); float diff = (newAngle - angleToCentroid); diff = (diff - MathHelper.Pi) % (2 * MathHelper.Pi); // the minus pi is important. It means cutoff for going other direction is at 180 deg where it needs to be if (diff < 0.0f) { diff += 2 * MathHelper.Pi; // correction for not handling negs } diff -= MathHelper.Pi; if (Math.Abs(diff) > MathHelper.Pi) { throw new ArgumentException("OMG!"); } // Something's wrong, point not in shape but exists angle diff > 180 if (diff > max) { max = diff; maxAbsolute = newAngle; } if (diff < min) { min = diff; minAbsolute = newAngle; } } vals[valIndex] = minAbsolute; ++valIndex; vals[valIndex] = maxAbsolute; ++valIndex; } } Array.Sort(vals, 0, valIndex, _rdc); _data.Clear(); bool rayMissed = true; for (int i = 0; i < valIndex; ++i) { Fixture shape = null; float midpt; int iplus = (i == valIndex - 1 ? 0 : i + 1); if (vals[i] == vals[iplus]) { continue; } if (i == valIndex - 1) { // the single edgecase midpt = (vals[0] + MathHelper.Pi * 2 + vals[i]); } else { midpt = (vals[i + 1] + vals[i]); } midpt = midpt / 2; Vector2 p1 = pos; Vector2 p2 = radius * new Vector2((float)Math.Cos(midpt), (float)Math.Sin(midpt)) + pos; // RaycastOne bool hitClosest = false; World.RayCast((f, p, n, fr) => { Body body = f.Body; if (!IsActiveOn(body)) { return(0); } //if (body.UserData != null) //{ // int index = (int)body.UserData; // if (index == 0) // { // // filter // return -1.0f; // } //} hitClosest = true; shape = f; return(fr); }, p1, p2); //draws radius points if ((hitClosest) && (shape.Body.BodyType == BodyType.Dynamic)) { if ((_data.Count() > 0) && (_data.Last().Body == shape.Body) && (!rayMissed)) { int laPos = _data.Count - 1; ShapeData la = _data[laPos]; la.Max = vals[iplus]; _data[laPos] = la; } else { // make new ShapeData d; d.Body = shape.Body; d.Min = vals[i]; d.Max = vals[iplus]; _data.Add(d); } if ((_data.Count() > 1) && (i == valIndex - 1) && (_data.Last().Body == _data.First().Body) && (_data.Last().Max == _data.First().Min)) { ShapeData fi = _data[0]; fi.Min = _data.Last().Min; _data.RemoveAt(_data.Count() - 1); _data[0] = fi; while (_data.First().Min >= _data.First().Max) { fi.Min -= MathHelper.Pi * 2; _data[0] = fi; } } int lastPos = _data.Count - 1; ShapeData last = _data[lastPos]; while ((_data.Count() > 0) && (_data.Last().Min >= _data.Last().Max)) // just making sure min<max { last.Min = _data.Last().Min - 2 * MathHelper.Pi; _data[lastPos] = last; } rayMissed = false; } else { rayMissed = true; // raycast did not find a shape } } for (int i = 0; i < _data.Count(); ++i) { if (!IsActiveOn(_data[i].Body)) { continue; } float arclen = _data[i].Max - _data[i].Min; float first = MathHelper.Min(MaxEdgeOffset, EdgeRatio * arclen); int insertedRays = (int)Math.Ceiling(((arclen - 2.0f * first) - (MinRays - 1) * MaxAngle) / MaxAngle); if (insertedRays < 0) { insertedRays = 0; } float offset = (arclen - first * 2.0f) / ((float)MinRays + insertedRays - 1); //Note: This loop can go into infinite as it operates on floats. //Added FloatEquals with a large epsilon. for (float j = _data[i].Min + first; j < _data[i].Max || MathUtils.FloatEquals(j, _data[i].Max, 0.0001f); j += offset) { Vector2 p1 = pos; Vector2 p2 = pos + radius * new Vector2((float)Math.Cos(j), (float)Math.Sin(j)); Vector2 hitpoint = Vector2.Zero; float minlambda = float.MaxValue; List <Fixture> fl = _data[i].Body.FixtureList; for (int x = 0; x < fl.Count; x++) { Fixture f = fl[x]; RayCastInput ri; ri.Point1 = p1; ri.Point2 = p2; ri.MaxFraction = 50f; RayCastOutput ro; if (f.RayCast(out ro, ref ri, 0)) { if (minlambda > ro.Fraction) { minlambda = ro.Fraction; hitpoint = ro.Fraction * p2 + (1 - ro.Fraction) * p1; } } // the force that is to be applied for this particular ray. // offset is angular coverage. lambda*length of segment is distance. float impulse = (arclen / (MinRays + insertedRays)) * maxForce * 180.0f / MathHelper.Pi * (1.0f - Math.Min(1.0f, minlambda)); // We Apply the impulse!!! Vector2 vectImp = Vector2.Dot(impulse * new Vector2((float)Math.Cos(j), (float)Math.Sin(j)), -ro.Normal) * new Vector2((float)Math.Cos(j), (float)Math.Sin(j)); _data[i].Body.ApplyLinearImpulse(ref vectImp, ref hitpoint); // We gather the fixtures for returning them Vector2 val = Vector2.Zero; List <Vector2> vectorList; if (_exploded.TryGetValue(f, out vectorList)) { val.X += Math.Abs(vectImp.X); val.Y += Math.Abs(vectImp.Y); vectorList.Add(val); } else { vectorList = new List <Vector2>(); val.X = Math.Abs(vectImp.X); val.Y = Math.Abs(vectImp.Y); vectorList.Add(val); _exploded.Add(f, vectorList); } if (minlambda > 1.0f) { hitpoint = p2; } } } } // We check contained shapes for (int i = 0; i < containedShapeCount; ++i) { Fixture fix = containedShapes[i]; if (!IsActiveOn(fix.Body)) { continue; } float impulse = MinRays * maxForce * 180.0f / MathHelper.Pi; Vector2 hitPoint; CircleShape circShape = fix.Shape as CircleShape; if (circShape != null) { hitPoint = fix.Body.GetWorldPoint(circShape.Position); } else { PolygonShape shape = fix.Shape as PolygonShape; hitPoint = fix.Body.GetWorldPoint(shape.MassData.Centroid); } Vector2 vectImp = impulse * (hitPoint - pos); List <Vector2> vectorList = new List <Vector2>(); vectorList.Add(vectImp); fix.Body.ApplyLinearImpulse(ref vectImp, ref hitPoint); if (!_exploded.ContainsKey(fix)) { _exploded.Add(fix, vectorList); } } return(_exploded); }
CantileverTest() { Body ground = BodyFactory.CreateEdge(World, new Vector2(-40, 0), new Vector2(40, 0)); { PolygonShape shape = new PolygonShape(20); shape.Vertices = PolygonTools.CreateRectangle(0.5f, 0.125f); Body prevBody = ground; for (int i = 0; i < Count; ++i) { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-14.5f + 1.0f * i, 5.0f); body.CreateFixture(shape); Vector2 anchor = new Vector2(-15.0f + 1.0f * i, 5.0f); WeldJoint jd = new WeldJoint(prevBody, body, anchor, anchor, true); World.AddJoint(jd); prevBody = body; } } { PolygonShape shape = new PolygonShape(20f); shape.Vertices = PolygonTools.CreateRectangle(1f, 0.125f); Body prevBody = ground; for (int i = 0; i < 3; ++i) { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-14.0f + 2.0f * i, 15.0f); body.CreateFixture(shape); Vector2 anchor = new Vector2(-15.0f + 2.0f * i, 15.0f); WeldJoint jd = new WeldJoint(prevBody, body, anchor, anchor, true); jd.FrequencyHz = 5.0f; jd.DampingRatio = 0.7f; World.AddJoint(jd); prevBody = body; } } { PolygonShape shape = new PolygonShape(20f); shape.Vertices = PolygonTools.CreateRectangle(0.5f, 0.125f); Body prevBody = ground; for (int i = 0; i < Count; ++i) { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-4.5f + 1.0f * i, 5.0f); body.CreateFixture(shape); if (i > 0) { Vector2 anchor = new Vector2(-5.0f + 1.0f * i, 5.0f); WeldJoint jd = new WeldJoint(prevBody, body, anchor, anchor, true); World.AddJoint(jd); } prevBody = body; } } { PolygonShape shape = new PolygonShape(20f); shape.Vertices = PolygonTools.CreateRectangle(0.5f, 0.125f); Body prevBody = ground; for (int i = 0; i < Count; ++i) { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(5.5f + 1.0f * i, 10.0f); body.CreateFixture(shape); if (i > 0) { Vector2 anchor = new Vector2(5.0f + 1.0f * i, 10.0f); WeldJoint jd = new WeldJoint(prevBody, body, anchor, anchor, true); jd.FrequencyHz = 8.0f; jd.DampingRatio = 0.7f; World.AddJoint(jd); } prevBody = body; } } //Triangels Vertices vertices = new Vertices(3); vertices.Add(new Vector2(-0.5f, 0.0f)); vertices.Add(new Vector2(0.5f, 0.0f)); vertices.Add(new Vector2(0.0f, 1.5f)); for (int i = 0; i < 2; ++i) { PolygonShape shape = new PolygonShape(vertices, 1); Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-8.0f + 8.0f * i, 12.0f); body.CreateFixture(shape); } //Circles for (int i = 0; i < 2; ++i) { CircleShape shape = new CircleShape(0.5f, 1); Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-6.0f + 6.0f * i, 10.0f); body.CreateFixture(shape); } }
private ApplyForceTest() { World.Gravity = Vector2.Zero; const float restitution = 0.4f; Body ground; { ground = World.CreateBody(); ground.Position = new Vector2(0.0f, 20.0f); EdgeShape shape = new EdgeShape(new Vector2(-20.0f, -20.0f), new Vector2(-20.0f, 20.0f)); // Left vertical Fixture fixture = ground.CreateFixture(shape); fixture.Restitution = restitution; // Right vertical shape = new EdgeShape(new Vector2(20.0f, -20.0f), new Vector2(20.0f, 20.0f)); ground.CreateFixture(shape); // Top horizontal shape = new EdgeShape(new Vector2(-20.0f, 20.0f), new Vector2(20.0f, 20.0f)); ground.CreateFixture(shape); // Bottom horizontal shape = new EdgeShape(new Vector2(-20.0f, -20.0f), new Vector2(20.0f, -20.0f)); ground.CreateFixture(shape); } { Transform xf1 = new Transform(new Vector2(1.0f, 0.0f), Complex.One); Transform.Multiply(ref xf1, Complex.FromAngle(0.3524f * MathHelper.Pi), out xf1); Vertices vertices = new Vertices(3); vertices.Add(Transform.Multiply(new Vector2(-1.0f, 0.0f), ref xf1)); vertices.Add(Transform.Multiply(new Vector2(1.0f, 0.0f), ref xf1)); vertices.Add(Transform.Multiply(new Vector2(0.0f, 0.5f), ref xf1)); PolygonShape poly1 = new PolygonShape(vertices, 4); Transform xf2 = new Transform(new Vector2(-1.0f, 0.0f), Complex.One); Transform.Multiply(ref xf2, Complex.FromAngle(-0.3524f * MathHelper.Pi), out xf2); vertices[0] = Transform.Multiply(new Vector2(-1.0f, 0.0f), ref xf2); vertices[1] = Transform.Multiply(new Vector2(1.0f, 0.0f), ref xf2); vertices[2] = Transform.Multiply(new Vector2(0.0f, 0.5f), ref xf2); PolygonShape poly2 = new PolygonShape(vertices, 2); _body = World.CreateBody(); _body.BodyType = BodyType.Dynamic; _body.Position = new Vector2(0.0f, 2.0f); _body.Rotation = MathHelper.Pi; _body.AngularDamping = 5.0f; _body.LinearDamping = 0.8f; _body.SleepingAllowed = true; _body.CreateFixture(poly1); _body.CreateFixture(poly2); } { Vertices box = PolygonTools.CreateRectangle(0.5f, 0.5f); PolygonShape shape = new PolygonShape(box, 1); for (int i = 0; i < 10; ++i) { Body body = World.CreateBody(); body.Position = new Vector2(0.0f, 5.0f + 1.54f * i); body.BodyType = BodyType.Dynamic; Fixture fixture = body.CreateFixture(shape); fixture.Friction = 0.3f; const float gravity = 10.0f; float I = body.Inertia; float mass = body.Mass; // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m) float radius = (float)Math.Sqrt(2.0 * (I / mass)); FrictionJoint jd = new FrictionJoint(ground, body, Vector2.Zero); jd.CollideConnected = true; jd.MaxForce = mass * gravity; jd.MaxTorque = mass * radius * gravity; World.Add(jd); } } }
public BodyTypes() { Body ground; { var bd = new BodyDef(); ground = World.CreateBody(bd); var shape = new EdgeShape(); shape.SetTwoSided(new Vector2(-20.0f, 0.0f), new Vector2(20.0f, 0.0f)); var fd = new FixtureDef(); fd.Shape = shape; ground.CreateFixture(fd); } // Define attachment { var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(0.0f, 3.0f); _attachment = World.CreateBody(bd); var shape = new PolygonShape(); shape.SetAsBox(0.5f, 2.0f); _attachment.CreateFixture(shape, 2.0f); } // Define platform { var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(-4.0f, 5.0f); _platform = World.CreateBody(bd); var shape = new PolygonShape(); shape.SetAsBox(0.5f, 4.0f, new Vector2(4.0f, 0.0f), 0.5f * Settings.Pi); var fd = new FixtureDef(); fd.Shape = shape; fd.Friction = 0.6f; fd.Density = 2.0f; _platform.CreateFixture(fd); var rjd = new RevoluteJointDef(); rjd.Initialize(_attachment, _platform, new Vector2(0.0f, 5.0f)); rjd.MaxMotorTorque = 50.0f; rjd.EnableMotor = true; World.CreateJoint(rjd); var pjd = new PrismaticJointDef(); pjd.Initialize(ground, _platform, new Vector2(0.0f, 5.0f), new Vector2(1.0f, 0.0f)); pjd.MaxMotorForce = 1000.0f; pjd.EnableMotor = true; pjd.LowerTranslation = -10.0f; pjd.UpperTranslation = 10.0f; pjd.EnableLimit = true; World.CreateJoint(pjd); _speed = 3.0f; } // Create a payload { var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(0.0f, 8.0f); var body = World.CreateBody(bd); var shape = new PolygonShape(); shape.SetAsBox(0.75f, 0.75f); var fd = new FixtureDef(); fd.Shape = shape; fd.Friction = 0.6f; fd.Density = 2.0f; body.CreateFixture(fd); } }
/// <summary> /// Call this to draw shapes and other debug draw data. /// </summary> private void DrawDebugData() { if ((Flags & DebugViewFlags.Shape) == DebugViewFlags.Shape) { foreach (Body b in World.BodyList.ToList <Body>()) { Transform xf; b.GetTransform(out xf); foreach (Fixture f in b.FixtureList) { if (b.Enabled == false) { DrawShape(f, xf, InactiveShapeColor); } else if (b.BodyType == BodyType.Static) { DrawShape(f, xf, StaticShapeColor); } else if (b.BodyType == BodyType.Kinematic) { DrawShape(f, xf, KinematicShapeColor); } else if (b.Awake == false) { DrawShape(f, xf, SleepingShapeColor); } else { DrawShape(f, xf, DefaultShapeColor); } } } } if ((Flags & DebugViewFlags.ContactPoints) == DebugViewFlags.ContactPoints) { const float axisScale = 0.3f; for (int i = 0; i < _pointCount; ++i) { ContactPoint point = _points[i]; if (point.State == PointState.Add) { // Add DrawPoint(point.Position, 0.1f, new Color(0.3f, 0.95f, 0.3f)); } else if (point.State == PointState.Persist) { // Persist DrawPoint(point.Position, 0.1f, new Color(0.3f, 0.3f, 0.95f)); } if ((Flags & DebugViewFlags.ContactNormals) == DebugViewFlags.ContactNormals) { Vector2 p1 = point.Position; Vector2 p2 = p1 + axisScale * point.Normal; DrawSegment(p1, p2, new Color(0.4f, 0.9f, 0.4f)); } } _pointCount = 0; } if ((Flags & DebugViewFlags.PolygonPoints) == DebugViewFlags.PolygonPoints) { foreach (Body body in World.BodyList) { foreach (Fixture f in body.FixtureList) { PolygonShape polygon = f.Shape as PolygonShape; if (polygon != null) { Transform xf; body.GetTransform(out xf); for (int i = 0; i < polygon.Vertices.Count; i++) { Vector2 tmp = MathUtils.Mul(ref xf, polygon.Vertices[i]); DrawPoint(tmp, 0.1f, Color.Red); } } } } } if ((Flags & DebugViewFlags.Joint) == DebugViewFlags.Joint) { foreach (Joint j in World.JointList) { DrawJoint(j); } } if ((Flags & DebugViewFlags.AABB) == DebugViewFlags.AABB) { Color color = new Color(0.9f, 0.3f, 0.9f); IBroadPhase bp = World.ContactManager.BroadPhase; foreach (Body b in World.BodyList) { if (b.Enabled == false) { continue; } foreach (Fixture f in b.FixtureList) { for (int t = 0; t < f.ProxyCount; ++t) { FixtureProxy proxy = f.Proxies[t]; AABB aabb; bp.GetFatAABB(proxy.ProxyId, out aabb); DrawAABB(ref aabb, color); } } } } if ((Flags & DebugViewFlags.CenterOfMass) == DebugViewFlags.CenterOfMass) { foreach (Body b in World.BodyList) { Transform xf; b.GetTransform(out xf); xf.p = b.WorldCenter; DrawTransform(ref xf); } } if ((Flags & DebugViewFlags.Controllers) == DebugViewFlags.Controllers) { for (int i = 0; i < World.ControllerList.Count; i++) { Controller controller = World.ControllerList[i]; BuoyancyController buoyancy = controller as BuoyancyController; if (buoyancy != null) { AABB container = buoyancy.Container; DrawAABB(ref container, Color.LightBlue); } } } if ((Flags & DebugViewFlags.DebugPanel) == DebugViewFlags.DebugPanel) { DrawDebugPanel(); } }
private EdgeTest() { { Body ground = BodyFactory.CreateBody(World); Vector2 v1 = new Vector2(-10.0f, 0.0f); Vector2 v2 = new Vector2(-7.0f, -2.0f); Vector2 v3 = new Vector2(-4.0f, 0.0f); Vector2 v4 = Vector2.Zero; Vector2 v5 = new Vector2(4.0f, 0.0f); Vector2 v6 = new Vector2(7.0f, 2.0f); Vector2 v7 = new Vector2(10.0f, 0.0f); EdgeShape shape = new EdgeShape(v1, v2); shape.HasVertex3 = true; shape.Vertex3 = v3; ground.CreateFixture(shape); shape.Set(v2, v3); shape.HasVertex0 = true; shape.HasVertex3 = true; shape.Vertex0 = v1; shape.Vertex3 = v4; ground.CreateFixture(shape); shape.Set(v3, v4); shape.HasVertex0 = true; shape.HasVertex3 = true; shape.Vertex0 = v2; shape.Vertex3 = v5; ground.CreateFixture(shape); shape.Set(v4, v5); shape.HasVertex0 = true; shape.HasVertex3 = true; shape.Vertex0 = v3; shape.Vertex3 = v6; ground.CreateFixture(shape); shape.Set(v5, v6); shape.HasVertex0 = true; shape.HasVertex3 = true; shape.Vertex0 = v4; shape.Vertex3 = v7; ground.CreateFixture(shape); shape.Set(v6, v7); shape.HasVertex0 = true; shape.Vertex0 = v5; ground.CreateFixture(shape); } { Body body = BodyFactory.CreateBody(World, new Vector2(-0.5f, 0.6f)); body.BodyType = BodyType.Dynamic; body.SleepingAllowed = false; CircleShape shape = new CircleShape(0.5f, 1); _circleFixture = body.CreateFixture(shape); } { Body body = BodyFactory.CreateBody(World, new Vector2(1.0f, 0.6f)); body.BodyType = BodyType.Dynamic; body.SleepingAllowed = false; PolygonShape shape = new PolygonShape(1); shape.SetAsBox(0.5f, 0.5f); body.CreateFixture(shape); } }
private TheoJansenTest() { _offset = new Vector2(0.0f, 8.0f); _motorSpeed = 2.0f; _motorOn = true; Vector2 pivot = new Vector2(0.0f, 0.8f); // Ground { Body ground = BodyFactory.CreateEdge(World, new Vector2(-50.0f, 0.0f), new Vector2(50.0f, 0.0f)); FixtureFactory.AttachEdge(new Vector2(-50.0f, 0.0f), new Vector2(-50.0f, 10.0f), ground); FixtureFactory.AttachEdge(new Vector2(50.0f, 0.0f), new Vector2(50.0f, 10.0f), ground); } // Balls for (int i = 0; i < 40; ++i) { CircleShape shape = new CircleShape(0.25f, 1); Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-40.0f + 2.0f * i, 0.5f); body.CreateFixture(shape); } // Chassis { PolygonShape shape = new PolygonShape(1); shape.Vertices = PolygonUtils.CreateRectangle(2.5f, 1.0f); _chassis = BodyFactory.CreateBody(World); _chassis.BodyType = BodyType.Dynamic; _chassis.Position = pivot + _offset; Fixture fixture = _chassis.CreateFixture(shape); fixture.CollisionGroup = -1; } { CircleShape shape = new CircleShape(1.6f, 1); _wheel = BodyFactory.CreateBody(World); _wheel.BodyType = BodyType.Dynamic; _wheel.Position = pivot + _offset; Fixture fixture = _wheel.CreateFixture(shape); fixture.CollisionGroup = -1; } { _motorJoint = new RevoluteJoint(_wheel, _chassis, _chassis.Position, true); _motorJoint.CollideConnected = false; _motorJoint.MotorSpeed = _motorSpeed; _motorJoint.MaxMotorTorque = 400.0f; _motorJoint.MotorEnabled = _motorOn; World.AddJoint(_motorJoint); } Vector2 wheelAnchor = pivot + new Vector2(0.0f, -0.8f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); _wheel.SetTransform(_wheel.Position, 120.0f * MathConstants.Pi / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); _wheel.SetTransform(_wheel.Position, -120.0f * MathConstants.Pi / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); }
public Dominos() { Body b1; { EdgeShape shape = new EdgeShape(); shape.Set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); shape.Density = 0; BodyDef bd = new BodyDef(); b1 = m_world.CreateBody(bd); b1.CreateFixture(shape); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(6.0f, 0.25f); BodyDef bd = new BodyDef(); bd.Position.Set(-1.5f, 10.0f); Body ground = m_world.CreateBody(bd); shape.Density = 0; ground.CreateFixture(shape); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.1f, 1.0f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 20.0f; fd.friction = 0.1f; for (int i = 0; i < 10; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(-6.0f + 1.0f * i, 11.25f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); } } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(7.0f, 0.25f, new Vec2(0, 0), 0.3f); shape.Density = 0; BodyDef bd = new BodyDef(); bd.Position.Set(1.0f, 6.0f); Body ground = m_world.CreateBody(bd); ground.CreateFixture(shape); } Body b2; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.25f, 1.5f); shape.Density = 0; BodyDef bd = new BodyDef(); bd.Position.Set(-7.0f, 4.0f); b2 = m_world.CreateBody(bd); b2.CreateFixture(shape); } Body b3; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(6.0f, 0.125f); shape.Density = 10; BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(-0.9f, 1.0f); bd.angle = -0.15f; b3 = m_world.CreateBody(bd); b3.CreateFixture(shape); } RevoluteJointDef jd = new RevoluteJointDef(); Vec2 anchor = new Vec2(); anchor.Set(-2.0f, 1.0f); jd.Initialize(b1, b3, anchor); jd.collideConnected = true; m_world.CreateJoint(jd); Body b4; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.25f, 0.25f); BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(-10.0f, 15.0f); b4 = m_world.CreateBody(bd); shape.Density = 10; shape.Density = 10; b4.CreateFixture(shape); } anchor.Set(-7.0f, 15.0f); jd.Initialize(b2, b4, anchor); m_world.CreateJoint(jd); Body b5; { BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(6.5f, 3.0f); b5 = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 10.0f; fd.friction = 0.1f; shape.SetAsBox(1.0f, 0.1f, new Vec2(0.0f, -0.9f), 0.0f); b5.CreateFixture(fd); shape.SetAsBox(0.1f, 1.0f, new Vec2(-0.9f, 0.0f), 0.0f); b5.CreateFixture(fd); shape.SetAsBox(0.1f, 1.0f, new Vec2(0.9f, 0.0f), 0.0f); b5.CreateFixture(fd); } anchor.Set(6.0f, 2.0f); jd.Initialize(b1, b5, anchor); m_world.CreateJoint(jd); Body b6; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(1.0f, 0.1f); BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(6.5f, 4.1f); b6 = m_world.CreateBody(bd); shape.Density = 30; b6.CreateFixture(shape); } anchor.Set(7.5f, 4.0f); jd.Initialize(b5, b6, anchor); m_world.CreateJoint(jd); Body b7; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.1f, 1.0f); BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(7.4f, 1.0f); b7 = m_world.CreateBody(bd); shape.Density = 10; b7.CreateFixture(shape); } DistanceJointDef djd = new DistanceJointDef(); djd.bodyA = b3; djd.bodyB = b7; djd.localAnchorA.Set(6.0f, 0.0f); djd.localAnchorB.Set(0.0f, -1.0f); Vec2 d = djd.bodyB.GetWorldPoint(djd.localAnchorB) - djd.bodyA.GetWorldPoint(djd.localAnchorA); djd.length = d.Length(); m_world.CreateJoint(djd); { float radius = 0.2f; CircleShape shape = new CircleShape(); shape.m_radius = radius; for (int i = 0; i < 4; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(5.9f + 2.0f * radius * i, 2.4f); Body body = m_world.CreateBody(bd); shape.Density = 10; body.CreateFixture(shape); } } }
private 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); PolygonShape poly1 = new PolygonShape(1); PolygonShape poly2 = new PolygonShape(1); Vertices vertices = new Vertices(3); if (s > 0.0f) { vertices.Add(p1); vertices.Add(p2); vertices.Add(p3); poly1.Vertices = vertices; vertices[0] = Vector2.Zero; vertices[1] = p5 - p4; vertices[2] = p6 - p4; poly2.Vertices = vertices; } else { vertices.Add(p1); vertices.Add(p3); vertices.Add(p2); poly1.Vertices = vertices; vertices[0] = Vector2.Zero; vertices[1] = p6 - p4; vertices[2] = p5 - p4; poly2.Vertices = vertices; } Body body1 = BodyFactory.CreateBody(World); body1.BodyType = BodyType.Dynamic; body1.Position = _offset; body1.AngularDamping = 10.0f; Body body2 = BodyFactory.CreateBody(World); body2.BodyType = BodyType.Dynamic; body2.Position = p4 + _offset; body2.AngularDamping = 10.0f; Fixture f1 = body1.CreateFixture(poly1); f1.CollisionGroup = -1; Fixture f2 = body2.CreateFixture(poly2); f2.CollisionGroup = -1; // 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. float dampingRatio = 0.5f; float frequencyHz = 10.0f; DistanceJoint djd = new DistanceJoint(body1, body2, p2 + _offset, p5 + _offset, true); JointHelper.LinearStiffness(frequencyHz, dampingRatio, djd.BodyA, djd.BodyB, out var stiffness, out var damping); djd.Damping = damping; djd.Stiffness = stiffness; World.AddJoint(djd); DistanceJoint djd2 = new DistanceJoint(body1, body2, p3 + _offset, p4 + _offset, true); djd2.Damping = damping; djd2.Stiffness = stiffness; World.AddJoint(djd2); DistanceJoint djd3 = new DistanceJoint(body1, _wheel, p3 + _offset, wheelAnchor + _offset, true); djd3.Damping = damping; djd3.Stiffness = stiffness; World.AddJoint(djd3); DistanceJoint djd4 = new DistanceJoint(body2, _wheel, p6 + _offset, wheelAnchor + _offset, true); djd4.Damping = damping; djd4.Stiffness = stiffness; World.AddJoint(djd4); RevoluteJoint rjd = new RevoluteJoint(body2, _chassis, p4 + _offset, true); World.AddJoint(rjd); }
/// <summary> /// Fires when a contact in the physics simulation is created. /// Enables the feature of simple one-way platform in the game. /// Contact of the one-way platform should be solid only when the other fixture is moving down to the one-platform. /// Works only for gravity with the default direction (down). /// </summary> /// <param name="contact">Contact created in the physics simulation.</param> /// <returns>Value of <c>true</c> keeps the contact solid.</returns> private bool PhysicsBeginContact(Contact contact) { // check if one of the fixtures is the platform // inspired by http://www.iforce2d.net/b2dtut/one-way-walls if (contact.FixtureA.Body != null && contact.FixtureB.Body != null) { Fixture platformFixture = null; Body platformBody = null, otherBody = null; if (((Actor)contact.FixtureA.UserData).OneWayPlatform && !contact.FixtureB.IsSensor) { platformFixture = contact.FixtureA; platformBody = contact.FixtureA.Body; otherBody = contact.FixtureB.Body; } else if (((Actor)contact.FixtureB.UserData).OneWayPlatform && !contact.FixtureA.IsSensor) { platformFixture = contact.FixtureB; platformBody = contact.FixtureB.Body; otherBody = contact.FixtureA.Body; } if (platformBody != null) { Vector2 normal; FixedArray2 <Vector2> points; contact.GetWorldManifold(out normal, out points); // check if contact points are moving downward for (int i = 0; i < contact.Manifold.PointCount; ++i) { Vector2 pointVelPlatform = platformBody.GetLinearVelocityFromWorldPoint(points[i]); Vector2 pointVelOther = otherBody.GetLinearVelocityFromWorldPoint(points[i]); Vector2 relativeVel = platformBody.GetLocalVector(pointVelOther - pointVelPlatform); if (platformFixture.ShapeType == FarseerPhysics.Collision.Shapes.ShapeType.Polygon) { PolygonShape polygon = platformFixture.Shape as PolygonShape; Vector2 relativePoint = platformBody.GetLocalPoint(points[i]); float platformFaceY = 0f; // find the heighest vertex of the polygon for (int j = 0; j < polygon.Vertices.Count; ++j) { if (polygon.Vertices[i].Y < platformFaceY) { platformFaceY = polygon.Vertices[i].Y; } } // check if point is at the front of the polygon if (relativePoint.Y < platformFaceY + 0.05f) { return(true); } } else { // point is moving down, leave contact solid and exit if (relativeVel.Y > 0) { return(true); } } } // no points are moving downward, contact should not be solid contact.Enabled = false; return(false); } } return(true); }
/// <summary> /// Collides the edge and polygon using the specified manifold /// </summary> /// <param name="manifold">The manifold</param> /// <param name="edgeA">The edge</param> /// <param name="xfA">The xf</param> /// <param name="polygonB">The polygon</param> /// <param name="xfB">The xf</param> public static void CollideEdgeAndPolygon(ref Manifold manifold, EdgeShape edgeA, ref Transform xfA, PolygonShape polygonB, ref Transform xfB) { manifold.PointCount = 0; Transform xf = MathUtils.MulT(xfA, xfB); Vector2 centroidB = MathUtils.Mul(ref xf, polygonB.MassDataPrivate.Centroid); Vector2 v1 = edgeA.Vertex1; Vector2 v2 = edgeA.Vertex2; Vector2 edge1 = v2 - v1; edge1 = Vector2.Normalize(edge1); // Normal points to the right for a CCW winding Vector2 normal1 = new Vector2(edge1.Y, -edge1.X); float offset1 = MathUtils.Dot(normal1, centroidB - v1); bool oneSided = edgeA.OneSided; if (oneSided && offset1 < 0.0f) { return; } // Get polygonB in frameA TempPolygon tempPolygonB = new TempPolygon(polygonB.VerticesPrivate.Count); for (int i = 0; i < polygonB.VerticesPrivate.Count; ++i) { tempPolygonB.Vertices[i] = MathUtils.Mul(ref xf, polygonB.VerticesPrivate[i]); tempPolygonB.Normals[i] = MathUtils.Mul(xf.Q, polygonB.NormalsPrivate[i]); } float radius = polygonB.RadiusPrivate + edgeA.RadiusPrivate; EpAxis edgeAxis = ComputeEdgeSeparation(ref tempPolygonB, v1, normal1); if (edgeAxis.Separation > radius) { return; } EpAxis polygonAxis = ComputePolygonSeparation(ref tempPolygonB, v1, v2); if (polygonAxis.Separation > radius) { return; } // Use hysteresis for jitter reduction. const float kRelativeTol = 0.98f; const float kAbsoluteTol = 0.001f; EpAxis primaryAxis; if (polygonAxis.Separation - radius > kRelativeTol * (edgeAxis.Separation - radius) + kAbsoluteTol) { primaryAxis = polygonAxis; } else { primaryAxis = edgeAxis; } if (oneSided) { // Smooth collision // See https://box2d.org/posts/2020/06/ghost-collisions/ Vector2 edge0 = v1 - edgeA.Vertex0; edge0 = Vector2.Normalize(edge0); Vector2 normal0 = new Vector2(edge0.Y, -edge0.X); bool convex1 = MathUtils.Cross(edge0, edge1) >= 0.0f; Vector2 edge2 = edgeA.Vertex3 - v2; edge2 = Vector2.Normalize(edge2); Vector2 normal2 = new Vector2(edge2.Y, -edge2.X); bool convex2 = MathUtils.Cross(edge1, edge2) >= 0.0f; const float sinTol = 0.1f; bool side1 = MathUtils.Dot(primaryAxis.Normal, edge1) <= 0.0f; // Check Gauss Map if (side1) { if (convex1) { if (MathUtils.Cross(primaryAxis.Normal, normal0) > sinTol) { // Skip region return; } // Admit region } else { // Snap region primaryAxis = edgeAxis; } } else { if (convex2) { if (MathUtils.Cross(normal2, primaryAxis.Normal) > sinTol) { // Skip region return; } // Admit region } else { // Snap region primaryAxis = edgeAxis; } } } FixedArray2 <ClipVertex> clipPoints = new FixedArray2 <ClipVertex>(); ReferenceFace ref1; if (primaryAxis.Type == EpAxisType.EdgeA) { manifold.Type = ManifoldType.FaceA; // Search for the polygon normal that is most anti-parallel to the edge normal. int bestIndex = 0; float bestValue = MathUtils.Dot(primaryAxis.Normal, tempPolygonB.Normals[0]); for (int i = 1; i < tempPolygonB.Count; ++i) { float value = MathUtils.Dot(primaryAxis.Normal, tempPolygonB.Normals[i]); if (value < bestValue) { bestValue = value; bestIndex = i; } } int i1 = bestIndex; int i2 = i1 + 1 < tempPolygonB.Count ? i1 + 1 : 0; clipPoints.Value0.V = tempPolygonB.Vertices[i1]; clipPoints.Value0.Id.ContactFeature.IndexA = 0; clipPoints.Value0.Id.ContactFeature.IndexB = (byte)i1; clipPoints.Value0.Id.ContactFeature.TypeA = ContactFeatureType.Face; clipPoints.Value0.Id.ContactFeature.TypeB = ContactFeatureType.Vertex; clipPoints.Value1.V = tempPolygonB.Vertices[i2]; clipPoints.Value1.Id.ContactFeature.IndexA = 0; clipPoints.Value1.Id.ContactFeature.IndexB = (byte)i2; clipPoints.Value1.Id.ContactFeature.TypeA = ContactFeatureType.Face; clipPoints.Value1.Id.ContactFeature.TypeB = ContactFeatureType.Vertex; ref1.I1 = 0; ref1.I2 = 1; ref1.V1 = v1; ref1.V2 = v2; ref1.Normal = primaryAxis.Normal; ref1.SideNormal1 = -edge1; ref1.SideNormal2 = edge1; } else { manifold.Type = ManifoldType.FaceB; clipPoints.Value0.V = v2; clipPoints.Value0.Id.ContactFeature.IndexA = 1; clipPoints.Value0.Id.ContactFeature.IndexB = (byte)primaryAxis.Index; clipPoints.Value0.Id.ContactFeature.TypeA = ContactFeatureType.Vertex; clipPoints.Value0.Id.ContactFeature.TypeB = ContactFeatureType.Face; clipPoints.Value1.V = v1; clipPoints.Value1.Id.ContactFeature.IndexA = 0; clipPoints.Value1.Id.ContactFeature.IndexB = (byte)primaryAxis.Index; clipPoints.Value1.Id.ContactFeature.TypeA = ContactFeatureType.Vertex; clipPoints.Value1.Id.ContactFeature.TypeB = ContactFeatureType.Face; ref1.I1 = primaryAxis.Index; ref1.I2 = ref1.I1 + 1 < tempPolygonB.Count ? ref1.I1 + 1 : 0; ref1.V1 = tempPolygonB.Vertices[ref1.I1]; ref1.V2 = tempPolygonB.Vertices[ref1.I2]; ref1.Normal = tempPolygonB.Normals[ref1.I1]; // CCW winding ref1.SideNormal1 = new Vector2(ref1.Normal.Y, -ref1.Normal.X); ref1.SideNormal2 = -ref1.SideNormal1; } ref1.SideOffset1 = MathUtils.Dot(ref1.SideNormal1, ref1.V1); ref1.SideOffset2 = MathUtils.Dot(ref1.SideNormal2, ref1.V2); // Clip incident edge against reference face side planes FixedArray2 <ClipVertex> clipPoints1; FixedArray2 <ClipVertex> clipPoints2; int np; // Clip to side 1 np = Collision.ClipSegmentToLine(out clipPoints1, ref clipPoints, ref1.SideNormal1, ref1.SideOffset1, ref1.I1); if (np < Settings.MaxManifoldPoints) { return; } // Clip to side 2 np = Collision.ClipSegmentToLine(out clipPoints2, ref clipPoints1, ref1.SideNormal2, ref1.SideOffset2, ref1.I2); if (np < Settings.MaxManifoldPoints) { return; } // Now clipPoints2 contains the clipped points. if (primaryAxis.Type == EpAxisType.EdgeA) { manifold.LocalNormal = ref1.Normal; manifold.LocalPoint = ref1.V1; } else { manifold.LocalNormal = polygonB.NormalsPrivate[ref1.I1]; manifold.LocalPoint = polygonB.VerticesPrivate[ref1.I1]; } int pointCount = 0; for (int i = 0; i < Settings.MaxManifoldPoints; ++i) { float separation = MathUtils.Dot(ref1.Normal, clipPoints2[i].V - ref1.V1); if (separation <= radius) { ManifoldPoint cp = manifold.Points[pointCount]; if (primaryAxis.Type == EpAxisType.EdgeA) { cp.LocalPoint = MathUtils.MulT(xf, clipPoints2[i].V); cp.Id = clipPoints2[i].Id; } else { cp.LocalPoint = clipPoints2[i].V; cp.Id.ContactFeature.TypeA = clipPoints2[i].Id.ContactFeature.TypeB; cp.Id.ContactFeature.TypeB = clipPoints2[i].Id.ContactFeature.TypeA; cp.Id.ContactFeature.IndexA = clipPoints2[i].Id.ContactFeature.IndexB; cp.Id.ContactFeature.IndexB = clipPoints2[i].Id.ContactFeature.IndexA; } manifold.Points[pointCount] = cp; ++pointCount; } } manifold.PointCount = pointCount; }
private CollisionProcessingTest() { //Ground World.CreateEdge(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 = World.CreateBody(); body1.BodyType = BodyType.Dynamic; body1.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); Fixture fixture = body1.CreateFixture(polygon); fixture.OnBeginContact += OnCollision; // Large triangle (recycle definitions) vertices[0] *= 2.0f; vertices[1] *= 2.0f; vertices[2] *= 2.0f; polygon.Vertices = vertices; Body body2 = World.CreateBody(); body2.BodyType = BodyType.Dynamic; body2.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body2.CreateFixture(polygon); fixture.OnBeginContact += OnCollision; // Small box Vertices smallBox = PolygonTools.CreateRectangle(1.0f, 0.5f); polygon.Vertices = smallBox; Body body3 = World.CreateBody(); body3.BodyType = BodyType.Dynamic; body3.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body3.CreateFixture(polygon); fixture.OnBeginContact += OnCollision; // Large box (recycle definitions) Vertices largeBox = PolygonTools.CreateRectangle(2.0f, 1.0f); polygon.Vertices = largeBox; Body body4 = World.CreateBody(); body4.BodyType = BodyType.Dynamic; body4.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body4.CreateFixture(polygon); fixture.OnBeginContact += OnCollision; // Small circle CircleShape circle = new CircleShape(1.0f, 1); Body body5 = World.CreateBody(); body5.BodyType = BodyType.Dynamic; body5.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body5.CreateFixture(circle); fixture.OnBeginContact += OnCollision; // Large circle circle.Radius *= 2.0f; Body body6 = World.CreateBody(); body6.BodyType = BodyType.Dynamic; body6.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body6.CreateFixture(circle); fixture.OnBeginContact += OnCollision; }
public override void CreateBody(World world, float width, float height) { _collisionWidth = width; _collisionHeight = height; var carPosition = Position2.ToMeters(); _body = new Body(world) { BodyType = BodyType.Dynamic, Position = carPosition, AngularDamping = 5 }; var halfWidth = width / 2; var halfHeight = height / 2; var frontWheelOffset = (float)CarInfo.FrontWheelOffset / 64; var rearWheelOffset = (float)CarInfo.RearWheelOffset / 64; //collision detection Fixture var vertices = new Vertices(4); vertices.Add(new Vector2(-halfWidth, -halfHeight)); //Top-Left vertices.Add(new Vector2(halfWidth, -halfHeight)); //Top-Right vertices.Add(new Vector2(halfWidth, halfHeight)); //Bottom-Right vertices.Add(new Vector2(-halfWidth, halfHeight)); //Bottom-Left _shape = new PolygonShape(vertices.ToMeters(), 0.1f); var fixture = _body.CreateFixture(_shape); //shape, density fixture.OnCollision += OnCollision; //SpriteId Fixture //var spriteHalfWidth = (float) CarInfo.Sprite.Rectangle.CollisionWidth/2; //ToDo //var spriteHalfHeight = (float) CarInfo.Sprite.Rectangle.CollisionHeight/2; var spriteHalfWidth = (float)52 / 64 / 2; var spriteHalfHeight = (float)128 / 64 / 2; var spriteVertices = new Vertices(4); spriteVertices.Add(new Vector2(-spriteHalfWidth, -spriteHalfHeight)); //Top-Left spriteVertices.Add(new Vector2(spriteHalfWidth, -spriteHalfHeight)); //Top-Right spriteVertices.Add(new Vector2(spriteHalfWidth, spriteHalfHeight)); //Bottom-Right spriteVertices.Add(new Vector2(-spriteHalfWidth, spriteHalfHeight)); //Bottom-Left _spriteShape = new PolygonShape(spriteVertices.ToMeters(), 0.1f); var spriteFixture = _body.CreateFixture(_spriteShape); spriteFixture.IsSensor = true; float maxForwardSpeed = 300; float maxBackwardSpeed = -40; float backWheelMaxDriveForce = 950; float frontWheelMaxDriveForce = 400; float backWheelMaxLateralImpulse = 9; float fronWheelMaxLateralImpulse = 9; //back left wheel var wheelOffsetPosition = new Vector2(halfWidth, rearWheelOffset).ToMeters(); var wheel = new Wheel(world); wheel.SetCharacteristics(maxForwardSpeed, maxBackwardSpeed, backWheelMaxDriveForce, backWheelMaxLateralImpulse); _wheels[0] = wheel; _backLeftJoint = CreateJoint(_body, wheel.Body, wheelOffsetPosition, world); //back right wheel wheelOffsetPosition = new Vector2(-halfWidth, rearWheelOffset).ToMeters(); wheel = new Wheel(world); wheel.SetCharacteristics(maxForwardSpeed, maxBackwardSpeed, backWheelMaxDriveForce, backWheelMaxLateralImpulse); _wheels[1] = wheel; _backRightJoint = CreateJoint(_body, wheel.Body, wheelOffsetPosition, world); //front left wheel wheelOffsetPosition = new Vector2(halfWidth, frontWheelOffset).ToMeters(); wheel = new Wheel(world); wheel.SetCharacteristics(maxForwardSpeed, maxBackwardSpeed, frontWheelMaxDriveForce, fronWheelMaxLateralImpulse); _wheels[2] = wheel; _frontLeftJoint = CreateJoint(_body, wheel.Body, wheelOffsetPosition, world); //front right wheel wheelOffsetPosition = new Vector2(-halfWidth, frontWheelOffset).ToMeters(); wheel = new Wheel(world); wheel.SetCharacteristics(maxForwardSpeed, maxBackwardSpeed, frontWheelMaxDriveForce, fronWheelMaxLateralImpulse); _wheels[3] = wheel; _frontRightJoint = CreateJoint(_body, wheel.Body, wheelOffsetPosition, world); }
public Tiles() { var fixtureCount = 0; var timer = Stopwatch.StartNew(); { var a = 0.5f; var bd = new BodyDef(); bd.Position.Y = -a; var ground = World.CreateBody(bd); var N = 200; var M = 10; var position = new Vector2(); position.Y = 0.0f; for (var j = 0; j < M; ++j) { position.X = -N * a; for (var i = 0; i < N; ++i) { var shape = new PolygonShape(); shape.SetAsBox(a, a, position, 0.0f); ground.CreateFixture(shape, 0.0f); ++fixtureCount; position.X += 2.0f * a; } position.Y -= 2.0f * a; } } { var a = 0.5f; var shape = new PolygonShape(); shape.SetAsBox(a, a); var x = new Vector2(-7.0f, 0.75f); var y = new Vector2(); var deltaX = new Vector2(0.5625f, 1.25f); var deltaY = new Vector2(1.125f, 0.0f); for (int i = 0; i < Count; ++i) { y = x; for (var j = i; j < Count; ++j) { var bd = new BodyDef { BodyType = BodyType.DynamicBody, Position = y }; var body = World.CreateBody(bd); if (_bodies[_bodyIndex] != null) { World.DestroyBody(_bodies[_bodyIndex]); _bodies[_bodyIndex] = null; } _bodies[_bodyIndex] = body; _bodyIndex = (_bodyIndex + 1) % MaxBodies; body.CreateFixture(shape, 5.0f); ++fixtureCount; y += deltaY; } x += deltaX; } } CreateTime = timer.ElapsedMilliseconds; FixtureCount = fixtureCount; }
public RopeJointTest() { 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 filter = fd.Filter; filter.CategoryBits = 0x0001; filter.MaskBits = 0xFFFF & ~0x0002; fd.Filter = filter; var jd = new RevoluteJointDef(); jd.CollideConnected = false; const int N = 10; const float y = 15.0f; _ropeDef.LocalAnchorA.Set(0.0f, y); var prevBody = ground; for (var i = 0; i < N; ++i) { var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(0.5f + 1.0f * i, y); if (i == N - 1) { shape.SetAsBox(1.5f, 1.5f); fd.Density = 100.0f; filter = fd.Filter; filter.CategoryBits = 0x0002; fd.Filter = filter; bd.Position.Set(1.0f * i, y); bd.AngularDamping = 0.4f; } var body = World.CreateBody(bd); body.CreateFixture(fd); var anchor = new Vector2(i, y); jd.Initialize(prevBody, body, anchor); World.CreateJoint(jd); prevBody = body; } _ropeDef.LocalAnchorB.SetZero(); var extraLength = 0.01f; _ropeDef.MaxLength = N - 1.0f + extraLength; _ropeDef.BodyB = prevBody; } { _ropeDef.BodyA = ground; _rope = World.CreateJoint(_ropeDef); } }