private ContinuousTest() { { BodyDef bd = new BodyDef(); bd.Position = new Vector2(0.0f, 0.0f); Body body = BodyFactory.CreateFromDef(World, bd); EdgeShape edge = new EdgeShape(); edge.SetTwoSided(new Vector2(-10.0f, 0.0f), new Vector2(10.0f, 0.0f)); body.AddFixture(edge); PolygonShape shape = new PolygonShape(0.0f); shape.SetAsBox(0.2f, 1.0f, new Vector2(0.5f, 1.0f), 0.0f); body.AddFixture(shape); } #if true { BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.Position = new Vector2(0.0f, 20.0f); PolygonShape shape = new PolygonShape(1.0f); shape.SetAsBox(2.0f, 0.1f); _body = BodyFactory.CreateFromDef(World, bd); _body.AddFixture(shape); _angularVelocity = Rand.RandomFloat(-50.0f, 50.0f); _body.LinearVelocity = new Vector2(0.0f, -100.0f); _body.AngularVelocity = _angularVelocity; } #else { BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.Position = new Vector2(0.0f, 2.0f); Body body = BodyFactory.CreateFromDef(World, bd); CircleShape shape = new CircleShape(0.5f, 1.0f); shape.Position = Vector2.Zero; body.AddFixture(shape); bd.IsBullet = true; bd.Position = new Vector2(0.0f, 10.0f); body = BodyFactory.CreateFromDef(World, bd); body.AddFixture(shape); body.LinearVelocity = new Vector2(0.0f, -100.0f); } #endif DistanceGJK.GJKCalls = 0; DistanceGJK.GJKIters = 0; DistanceGJK.GJKMaxIters = 0; TimeOfImpact.TOICalls = 0; TimeOfImpact.TOIIters = 0; TimeOfImpact.TOIRootIters = 0; TimeOfImpact.TOIMaxRootIters = 0; }
private Heavy1Test() { { BodyDef bd = new BodyDef(); Body ground = BodyFactory.CreateFromDef(World, bd); EdgeShape shape = new EdgeShape(); shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.AddFixture(shape); } { BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.Position = new Vector2(0.0f, 0.5f); Body body = BodyFactory.CreateFromDef(World, bd); CircleShape shape = new CircleShape(10.0f); shape.Radius = 0.5f; body.AddFixture(shape); bd.Position = new Vector2(0.0f, 6.0f); body = BodyFactory.CreateFromDef(World, bd); shape.Radius = 5.0f; body.AddFixture(shape); } }
private BreakableTest() { // Ground body { BodyDef bd = new BodyDef(); Body ground = BodyFactory.CreateFromDef(World, bd); EdgeShape shape = new EdgeShape(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.AddFixture(shape); } // Breakable dynamic body { BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.Position = new Vector2(0.0f, 40.0f); bd.Angle = 0.25f * MathConstants.Pi; _body1 = BodyFactory.CreateFromDef(World, bd); _shape1 = new PolygonShape(1.0f); _shape1.SetAsBox(0.5f, 0.5f, new Vector2(-0.5f, 0.0f), 0.0f); _piece1 = _body1.AddFixture(_shape1); _shape2 = new PolygonShape(1.0f); _shape2.SetAsBox(0.5f, 0.5f, new Vector2(0.5f, 0.0f), 0.0f); _piece2 = _body1.AddFixture(_shape2); } _break = false; _broke = false; }
private CircleBenchmarkTest() { Body ground = BodyFactory.CreateBody(World); // Floor EdgeShape ashape = new EdgeShape(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.AddFixture(ashape); // Left wall ashape = new EdgeShape(new Vector2(-40.0f, 0.0f), new Vector2(-40.0f, 45.0f)); ground.AddFixture(ashape); // Right wall ashape = new EdgeShape(new Vector2(40.0f, 0.0f), new Vector2(40.0f, 45.0f)); ground.AddFixture(ashape); // Roof ashape = new EdgeShape(new Vector2(-40.0f, 45.0f), new Vector2(40.0f, 45.0f)); ground.AddFixture(ashape); CircleShape shape = new CircleShape(1.0f, 1); for (int i = 0; i < XCount; i++) { for (int j = 0; j < YCount; ++j) { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-38f + 2.1f * i, 2.0f + 2.0f * j); body.AddFixture(shape); } } }
private RockBreakTest() { // Ground body BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); // Breakable dynamic body _body1 = BodyFactory.CreateBody(World); _body1.BodyType = BodyType.Dynamic; _body1.Position = new Vector2(0.0f, 40.0f); _body1.Rotation = 0.25f * MathConstants.Pi; Vertices box = PolygonUtils.CreateRectangle(0.5f, 0.5f, new Vector2(-0.5f, 0.0f), 0.0f); PolygonShape shape1 = new PolygonShape(box, 1); _piece1 = _body1.AddFixture(shape1); box = PolygonUtils.CreateRectangle(0.5f, 0.5f, new Vector2(0.5f, 0.0f), 0.0f); _shape2 = new PolygonShape(box, 1); _piece2 = _body1.AddFixture(_shape2); _break = false; _broke = false; }
private SensorsTest() { { BodyDef bd = new BodyDef(); Body ground = BodyFactory.CreateFromDef(World, bd); { EdgeShape shape = new EdgeShape(); shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.AddFixture(shape); } #if false { FixtureDef sd; sd.SetAsBox(10.0f, 2.0f, b2Vec2(0.0f, 20.0f), 0.0f); sd.isSensor = true; _sensor = ground.CreateFixture(sd); } #else { CircleShape shape = new CircleShape(0.0f); shape.Radius = 5.0f; shape.Position = new Vector2(0.0f, 10.0f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.IsSensor = true; _sensor = ground.AddFixture(fd); } #endif } { CircleShape shape = new CircleShape(1.0f); shape.Radius = 1.0f; for (int i = 0; i < _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] = BodyFactory.CreateFromDef(World, bd); _bodies[i].AddFixture(shape); } } _force = 100.0f; World.ContactManager.BeginContact += BeginContact; World.ContactManager.EndContact += EndContact; }
private ConfinedTest() { { BodyDef bd = new BodyDef(); Body ground = BodyFactory.CreateFromDef(World, bd); EdgeShape shape = new EdgeShape(); // Floor shape.SetTwoSided(new Vector2(-10.0f, 0.0f), new Vector2(10.0f, 0.0f)); ground.AddFixture(shape); // Left wall shape.SetTwoSided(new Vector2(-10.0f, 0.0f), new Vector2(-10.0f, 20.0f)); ground.AddFixture(shape); // Right wall shape.SetTwoSided(new Vector2(10.0f, 0.0f), new Vector2(10.0f, 20.0f)); ground.AddFixture(shape); // Roof shape.SetTwoSided(new Vector2(-10.0f, 20.0f), new Vector2(10.0f, 20.0f)); ground.AddFixture(shape); } { float radius = 0.5f; CircleShape shape = new CircleShape(1.0f); shape.Position = Vector2.Zero; shape.Radius = radius; FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Friction = 0.1f; for (int j = 0; j < _columnCount; ++j) { for (int i = 0; i < _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 = BodyFactory.CreateFromDef(World, bd); body.AddFixture(fd); } } World.Gravity = new Vector2(0.0f, 0.0f); } }
private CircleStackTest() { { BodyDef bd = new BodyDef(); Body ground = BodyFactory.CreateFromDef(World, bd); EdgeShape shape = new EdgeShape(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.AddFixture(shape); } { CircleShape shape = new CircleShape(1.0f, 1.0f); for (int i = 0; i < _count; ++i) { BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.Position = new Vector2(0.0f, 4.0f + 3.0f * i); _bodies[i] = BodyFactory.CreateFromDef(World, bd); _bodies[i].AddFixture(shape); _bodies[i].LinearVelocity = new Vector2(0.0f, -50.0f); } } }
private CuttingTest() { //Ground BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); Vertices box = PolygonUtils.CreateRectangle(0.5f, 0.5f); PolygonShape shape = new PolygonShape(box, 5); Vector2 x = new Vector2(-7.0f, 0.75f); Vector2 deltaX = new Vector2(0.5625f, 1.25f); Vector2 deltaY = new Vector2(1.125f, 0.0f); for (int i = 0; i < Count; ++i) { Vector2 y = x; for (int j = i; j < Count; ++j) { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = y; body.AddFixture(shape); y += deltaY; } x += deltaX; } }
public override void Keyboard(KeyboardManager keyboard) { if (keyboard.IsNewKeyPress(Keys.C)) { if (_fixture2 == null) { CircleShape shape = new CircleShape(10.0f); shape.Radius = 3.0f; shape.Position = new Vector2(0.5f, -4.0f); _fixture2 = _body.AddFixture(shape); _body.Awake = true; } } else if (keyboard.IsNewKeyPress(Keys.D)) { if (_fixture2 != null) { _body.RemoveFixture(_fixture2); _fixture2 = null; _body.Awake = true; } } else if (keyboard.IsNewKeyPress(Keys.S)) { if (_fixture2 != null) { _sensor = !_sensor; _fixture2.IsSensor = _sensor; } } base.Keyboard(keyboard); }
private void Break() { // Create two bodies from one. Body body1 = _piece1.Body; Vector2 center = body1.WorldCenter; body1.RemoveFixture(_piece2); _piece2 = null; Body body2 = BodyFactory.CreateBody(World); body2.BodyType = BodyType.Dynamic; body2.Position = body1.Position; body2.Rotation = body1.Rotation; _piece2 = body2.AddFixture(_shape2); // Compute consistent velocities for new bodies based on // cached velocity. Vector2 center1 = body1.WorldCenter; Vector2 center2 = body2.WorldCenter; Vector2 velocity1 = _velocity + MathUtils.Cross(_angularVelocity, center1 - center); Vector2 velocity2 = _velocity + MathUtils.Cross(_angularVelocity, center2 - center); body1.AngularVelocity = _angularVelocity; body1.LinearVelocity = velocity1; body2.AngularVelocity = _angularVelocity; body2.LinearVelocity = velocity2; }
public override void Keyboard(KeyboardManager keyboard) { if (keyboard.IsNewKeyPress(Keys.OemComma)) { if (_bullet != null) { World.RemoveBody(_bullet); _bullet = null; } { CircleShape shape = new CircleShape(0.25f, 20); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Restitution = 0.05f; BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.IsBullet = true; bd.Position = new Vector2(-31.0f, 5.0f); _bullet = BodyFactory.CreateFromDef(World, bd); _bullet.AddFixture(fd); _bullet.LinearVelocity = new Vector2(400.0f, 0.0f); } } base.Keyboard(keyboard); }
private ShapeEditingTest() { { BodyDef bd = new BodyDef(); Body ground = BodyFactory.CreateFromDef(World, bd); EdgeShape shape = new EdgeShape(); shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.AddFixture(shape); } { BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.Position = new Vector2(0.0f, 10.0f); _body = BodyFactory.CreateFromDef(World, bd); PolygonShape shape = new PolygonShape(10.0f); shape.SetAsBox(4.0f, 4.0f, new Vector2(0.0f, 0.0f), 0.0f); _fixture1 = _body.AddFixture(shape); _fixture2 = null; _sensor = false; } }
private Body AddNode(Body parent, Vector2 localAnchor, int depth, float offset, float a) { float density = 20.0f; Vector2 h = new Vector2(0.0f, a); Vector2 p = parent.Position + localAnchor - h; BodyDef bodyDef = new BodyDef(); bodyDef.Type = BodyType.Dynamic; bodyDef.Position = p; Body body = BodyFactory.CreateFromDef(World, bodyDef); PolygonShape shape = new PolygonShape(density); shape.SetAsBox(0.25f * a, a); body.AddFixture(shape); if (depth == _depth) { return(body); } shape.SetAsBox(offset, 0.25f * a, new Vector2(0, -a), 0.0f); body.AddFixture(shape); Vector2 a1 = new Vector2(offset, -a); Vector2 a2 = new Vector2(-offset, -a); Body body1 = AddNode(body, a1, depth + 1, 0.5f * offset, a); Body body2 = AddNode(body, a2, depth + 1, 0.5f * offset, a); RevoluteJointDef jointDef = new RevoluteJointDef(); jointDef.BodyA = body; jointDef.LocalAnchorB = h; jointDef.LocalAnchorA = a1; jointDef.BodyB = body1; JointFactory.CreateFromDef(World, jointDef); jointDef.LocalAnchorA = a2; jointDef.BodyB = body2; JointFactory.CreateFromDef(World, jointDef); return(body); }
//Contributed by Matthew Bettcher /// <summary>Convert a path into a set of edges and attaches them to the specified body. Note: use only for static edges.</summary> /// <param name="path">The path.</param> /// <param name="body">The body.</param> /// <param name="subdivisions">The subdivisions.</param> public static void ConvertPathToEdges(Path path, Body body, int subdivisions) { Vertices verts = path.GetVertices(subdivisions); if (path.Closed) { ChainShape chain = new ChainShape(verts, true); body.AddFixture(chain); } else { for (int i = 1; i < verts.Count; i++) { body.AddFixture(new EdgeShape(verts[i], verts[i - 1])); } } }
public static Fixture AttachLoopShape(Vertices vertices, Body body, object?userData = null) { ChainShape shape = new ChainShape(vertices, true); Fixture f = body.AddFixture(shape); f.UserData = userData; return(f); }
public static Fixture AttachEdge(Vector2 start, Vector2 end, Body body, object?userData = null) { EdgeShape edgeShape = new EdgeShape(start, end); Fixture f = body.AddFixture(edgeShape); f.UserData = userData; return(f); }
private PolygonShapesTest() { // Ground body { BodyDef bd = new BodyDef(); Body ground = BodyFactory.CreateFromDef(World, bd); EdgeShape shape = new EdgeShape(); shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.AddFixture(shape); } { 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)); _polygons[0] = new PolygonShape(vertices, 1.0f); } { Vertices vertices = new Vertices(3); vertices.Add(new Vector2(-0.1f, 0.0f)); vertices.Add(new Vector2(0.1f, 0.0f)); vertices.Add(new Vector2(0.0f, 1.5f)); _polygons[1] = new PolygonShape(vertices, 1.0f); } { float w = 1.0f; float b = w / (2.0f + MathUtils.Sqrt(2.0f)); float s = MathUtils.Sqrt(2.0f) * b; Vertices vertices = new Vertices(8); vertices.Add(new Vector2(0.5f * s, 0.0f)); vertices.Add(new Vector2(0.5f * w, b)); vertices.Add(new Vector2(0.5f * w, b + s)); vertices.Add(new Vector2(0.5f * s, w)); vertices.Add(new Vector2(-0.5f * s, w)); vertices.Add(new Vector2(-0.5f * w, b + s)); vertices.Add(new Vector2(-0.5f * w, b)); vertices.Add(new Vector2(-0.5f * s, 0.0f)); _polygons[2] = new PolygonShape(vertices, 1.0f); } { _polygons[3] = new PolygonShape(1.0f); _polygons[3].SetAsBox(0.5f, 0.5f); } { _circle = new CircleShape(1.0f); _circle.Radius = 0.5f; } _bodyIndex = 0; }
public static Fixture AttachRectangle(float width, float height, float density, Vector2 offset, Body body, object?userData = null) { Vertices rectangleVertices = PolygonUtils.CreateRectangle(width / 2, height / 2); rectangleVertices.Translate(ref offset); PolygonShape rectangleShape = new PolygonShape(rectangleVertices, density); Fixture f = body.AddFixture(rectangleShape); f.UserData = userData; return(f); }
private PathTest() { //Single body that moves around path _movingBody = BodyFactory.CreateBody(World); _movingBody.Position = new Vector2(-25, 25); _movingBody.BodyType = BodyType.Dynamic; _movingBody.AddFixture(new PolygonShape(PolygonUtils.CreateRectangle(0.5f, 0.5f), 1)); //Static shape made up of bodies _path = new Path(); _path.Add(new Vector2(0, 20)); _path.Add(new Vector2(5, 15)); _path.Add(new Vector2(20, 18)); _path.Add(new Vector2(15, 1)); _path.Add(new Vector2(-5, 14)); _path.Closed = true; CircleShape shape = new CircleShape(0.25f, 1); PathManager.EvenlyDistributeShapesAlongPath(World, _path, shape, BodyType.Static, 100); //Smaller shape that is movable. Created from small rectangles and circles. Vector2 xform = new Vector2(0.5f, 0.5f); _path.Scale(ref xform); xform = new Vector2(5, 5); _path.Translate(ref xform); List <Shape> shapes = new List <Shape>(2); shapes.Add(new PolygonShape(PolygonUtils.CreateRectangle(0.5f, 0.5f, new Vector2(-0.1f, 0), 0), 1)); shapes.Add(new CircleShape(0.5f, 1)); List <Body> bodies = PathManager.EvenlyDistributeShapesAlongPath(World, _path, shapes, BodyType.Dynamic, 20); //Attach the bodies together with revolute joints PathManager.AttachBodiesWithRevoluteJoint(World, bodies, new Vector2(0, 0.5f), new Vector2(0, -0.5f), true, true); xform = new Vector2(-25, 0); _path.Translate(ref xform); Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Static; //Static shape made up of edges PathManager.ConvertPathToEdges(_path, body, 25); body.Position -= new Vector2(0, 10); xform = new Vector2(0, 15); _path.Translate(ref xform); PathManager.ConvertPathToPolygon(_path, body, 1, 50); }
public static List <Fixture> AttachCompoundPolygon(List <Vertices> list, float density, Body body) { List <Fixture> res = new List <Fixture>(list.Count); //Then we create several fixtures using the body foreach (Vertices vertices in list) { if (vertices.Count == 2) { EdgeShape shape = new EdgeShape(vertices[0], vertices[1]); res.Add(body.AddFixture(shape)); } else { PolygonShape shape = new PolygonShape(vertices, density); res.Add(body.AddFixture(shape)); } } return(res); }
private TumblerTest() { Body ground; { BodyDef bd = new BodyDef(); ground = BodyFactory.CreateFromDef(World, bd); } { BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.AllowSleep = false; bd.Position = new Vector2(0.0f, 10.0f); Body body = BodyFactory.CreateFromDef(World, bd); PolygonShape shape = new PolygonShape(5.0f); shape.SetAsBox(0.5f, 10.0f, new Vector2(10.0f, 0.0f), 0.0f); body.AddFixture(shape); shape.SetAsBox(0.5f, 10.0f, new Vector2(-10.0f, 0.0f), 0.0f); body.AddFixture(shape); shape.SetAsBox(10.0f, 0.5f, new Vector2(0.0f, 10.0f), 0.0f); body.AddFixture(shape); shape.SetAsBox(10.0f, 0.5f, new Vector2(0.0f, -10.0f), 0.0f); body.AddFixture(shape); RevoluteJointDef jd = new RevoluteJointDef(); jd.BodyA = ground; jd.BodyB = body; jd.LocalAnchorA = new Vector2(0.0f, 10.0f); jd.LocalAnchorB = new Vector2(0.0f, 0.0f); jd.ReferenceAngle = 0.0f; jd.MotorSpeed = 0.05f * MathConstants.Pi; jd.MaxMotorTorque = 1e8f; jd.EnableMotor = true; _joint = (RevoluteJoint)JointFactory.CreateFromDef(World, jd); } _count2 = 0; }
private BulletTest() { { BodyDef bd = new BodyDef(); bd.Position = new Vector2(0.0f, 0.0f); Body body = BodyFactory.CreateFromDef(World, bd); EdgeShape edge = new EdgeShape(new Vector2(-10.0f, 0.0f), new Vector2(10.0f, 0.0f)); body.AddFixture(edge); PolygonShape shape = new PolygonShape(0.0f); shape.SetAsBox(0.2f, 1.0f, new Vector2(0.5f, 1.0f), 0.0f); body.AddFixture(shape); } { BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.Position = new Vector2(0.0f, 4.0f); PolygonShape box = new PolygonShape(1.0f); box.SetAsBox(2.0f, 0.1f); _body = BodyFactory.CreateFromDef(World, bd); _body.AddFixture(box); box.SetAsBox(0.25f, 0.25f); _x = 0.20352793f; bd.Position = new Vector2(_x, 10.0f); bd.IsBullet = true; box.Density = 100; _bullet = BodyFactory.CreateFromDef(World, bd); _bullet.AddFixture(box); _bullet.LinearVelocity = new Vector2(0.0f, -50.0f); } }
public static Fixture AttachPolygon(Vertices vertices, float density, Body body, object?userData = null) { if (vertices.Count <= 1) { throw new ArgumentOutOfRangeException(nameof(vertices), "Too few points to be a polygon"); } PolygonShape polygon = new PolygonShape(vertices, density); Fixture f = body.AddFixture(polygon); f.UserData = userData; return(f); }
public static Fixture AttachCircle(float radius, float density, Body body, object?userData = null) { if (radius <= 0) { throw new ArgumentOutOfRangeException(nameof(radius), "Radius must be more than 0 meters"); } CircleShape circleShape = new CircleShape(radius, density); Fixture f = body.AddFixture(circleShape); f.UserData = userData; return(f); }
private WheelJointTest() { Body ground; { BodyDef bd = new BodyDef(); ground = BodyFactory.CreateFromDef(World, bd); EdgeShape shape = new EdgeShape(); shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.AddFixture(shape); } _enableLimit = true; _enableMotor = false; _motorSpeed = 10.0f; { CircleShape shape = new CircleShape(5.0f); shape.Radius = 2.0f; BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.Position = new Vector2(0.0f, 10.0f); bd.AllowSleep = false; Body body = BodyFactory.CreateFromDef(World, bd); body.AddFixture(shape); WheelJointDef jd = new WheelJointDef(); // Horizontal jd.Initialize(ground, body, bd.Position, new Vector2(0.0f, 1.0f)); jd.MotorSpeed = _motorSpeed; jd.MaxMotorTorque = 10000.0f; jd.EnableMotor = _enableMotor; jd.LowerTranslation = -3.0f; jd.UpperTranslation = 3.0f; jd.EnableLimit = _enableLimit; float hertz = 1.0f; float dampingRatio = 0.7f; JointHelper.LinearStiffness(hertz, dampingRatio, ground, body, out float stiffness, out float damping); jd.Stiffness = stiffness; jd.Damping = damping; _joint = (WheelJoint)JointFactory.CreateFromDef(World, jd); } }
private PulleyJointTest() { float y = 16.0f; float L = 12.0f; float a = 1.0f; float b = 2.0f; Body ground; { BodyDef bd = new BodyDef(); ground = BodyFactory.CreateFromDef(World, bd); CircleShape circle = new CircleShape(0.0f); circle.Radius = 2.0f; circle.Position = new Vector2(-10.0f, y + b + L); ground.AddFixture(circle); circle.Position = new Vector2(10.0f, y + b + L); ground.AddFixture(circle); } { PolygonShape shape = new PolygonShape(5.0f); shape.SetAsBox(a, b); BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; //bd.FixedRotation = true; bd.Position = new Vector2(-10.0f, y); Body body1 = BodyFactory.CreateFromDef(World, bd); body1.AddFixture(shape); bd.Position = new Vector2(10.0f, y); Body body2 = BodyFactory.CreateFromDef(World, bd); body2.AddFixture(shape); 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, 1.5f); _joint1 = (PulleyJoint)JointFactory.CreateFromDef(World, pulleyDef); } }
/// <summary>Convert a closed path into a polygon. Convex decomposition is automatically performed.</summary> /// <param name="path">The path.</param> /// <param name="body">The body.</param> /// <param name="density">The density.</param> /// <param name="subdivisions">The subdivisions.</param> public static void ConvertPathToPolygon(Path path, Body body, float density, int subdivisions) { if (!path.Closed) { throw new Exception("The path must be closed to convert to a polygon."); } List <Vector2> verts = path.GetVertices(subdivisions); List <Vertices> decomposedVerts = Triangulate.ConvexPartition(new Vertices(verts), TriangulationAlgorithm.Bayazit); foreach (Vertices item in decomposedVerts) { body.AddFixture(new PolygonShape(item, density)); } }
public override void Update(GameSettings settings, GameTime gameTime) { base.Update(settings, gameTime); if (_count2 < _eCount) { BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.Position = new Vector2(0.0f, 10.0f); Body body = BodyFactory.CreateFromDef(World, bd); PolygonShape shape = new PolygonShape(1.0f); shape.SetAsBox(0.125f, 0.125f); body.AddFixture(shape); ++_count2; } }
private PrismaticJointTest() { Body ground; { BodyDef bd = new BodyDef(); ground = BodyFactory.CreateFromDef(World, bd); EdgeShape shape = new EdgeShape(); shape.SetTwoSided(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.AddFixture(shape); } _enableLimit = true; _enableMotor = false; _motorSpeed = 10.0f; { PolygonShape shape = new PolygonShape(5.0f); shape.SetAsBox(1.0f, 1.0f); BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.Position = new Vector2(0.0f, 10.0f); bd.Angle = 0.5f * MathConstants.Pi; bd.AllowSleep = false; Body body = BodyFactory.CreateFromDef(World, bd); body.AddFixture(shape); PrismaticJointDef pjd = new PrismaticJointDef(); // Horizontal pjd.Initialize(ground, body, bd.Position, new Vector2(1.0f, 0.0f)); pjd.MotorSpeed = _motorSpeed; pjd.MaxMotorForce = 10000.0f; pjd.EnableMotor = _enableMotor; pjd.LowerTranslation = -10.0f; pjd.UpperTranslation = 10.0f; pjd.EnableLimit = _enableLimit; _joint = (PrismaticJoint)JointFactory.CreateFromDef(World, pjd); } }