internal b2RevoluteJoint(b2RevoluteJointDef def) : base(def) { m_localAnchorA = def.localAnchorA; m_localAnchorB = def.localAnchorB; m_referenceAngle = def.referenceAngle; m_impulse.SetZero(); m_motorImpulse = 0.0f; m_lowerAngle = def.lowerAngle; m_upperAngle = def.upperAngle; m_maxMotorTorque = def.maxMotorTorque; m_motorSpeed = def.motorSpeed; m_enableLimit = def.enableLimit; m_enableMotor = def.enableMotor; m_limitState = b2LimitState.e_inactiveLimit; }
public Chain() { b2Body ground = null; { b2BodyDef bd = new b2BodyDef(); ground = m_world.CreateBody(bd); b2EdgeShape shape = new b2EdgeShape(); shape.Set(new b2Vec2(-40.0f, 0.0f), new b2Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(0.6f, 0.125f); b2FixtureDef fd = new b2FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.friction = 0.2f; b2RevoluteJointDef jd = new b2RevoluteJointDef(); jd.CollideConnected = false; const float y = 25.0f; b2Body prevBody = ground; for (int i = 0; i < 30; ++i) { b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(0.5f + i, y); b2Body body = m_world.CreateBody(bd); body.CreateFixture(fd); b2Vec2 anchor = new b2Vec2(i, y); jd.Initialize(prevBody, body, anchor); m_world.CreateJoint(jd); prevBody = body; } } }
public Tumbler() { b2Body ground; { b2BodyDef bd = new b2BodyDef(); ground = m_world.CreateBody(bd); } { b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.allowSleep = false; bd.position.Set(0.0f, 10.0f); b2Body body = m_world.CreateBody(bd); b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(0.5f, 10.0f, new b2Vec2(10.0f, 0.0f), 0.0f); body.CreateFixture(shape, 5.0f); shape.SetAsBox(0.5f, 10.0f, new b2Vec2(-10.0f, 0.0f), 0.0f); body.CreateFixture(shape, 5.0f); shape.SetAsBox(10.0f, 0.5f, new b2Vec2(0.0f, 10.0f), 0.0f); body.CreateFixture(shape, 5.0f); shape.SetAsBox(10.0f, 0.5f, new b2Vec2(0.0f, -10.0f), 0.0f); body.CreateFixture(shape, 5.0f); b2RevoluteJointDef jd = new b2RevoluteJointDef(); jd.BodyA = ground; jd.BodyB = body; jd.localAnchorA.Set(0.0f, 10.0f); jd.localAnchorB.Set(0.0f, 0.0f); jd.referenceAngle = 0.0f; jd.motorSpeed = 0.05f * b2Settings.b2_pi; jd.maxMotorTorque = 1e8f; jd.enableMotor = true; m_joint = (b2RevoluteJoint)m_world.CreateJoint(jd); } m_count = 0; }
private void create() { b2Body bodyB; if (connectedB2BodyObject == null) { bodyB = _world.GetGroundBody(); } else { bodyB = connectedB2BodyObject.body; } b2RevoluteJointDef jointDef = new b2RevoluteJointDef(); jointDef.Initialize(_bodyObject.body, bodyB, new b2Vec2()); jointDef.collideConnected = enableCollision; jointDef.enableLimit = enableLimit; jointDef.referenceAngle = referenceAngle; jointDef.lowerAngle = lowerAngle; jointDef.upperAngle = upperAngle; jointDef.enableMotor = enableMotor; jointDef.motorSpeed = motorSpeed; jointDef.maxMotorTorque = maxMotorTorque; _joint = _world.CreateJoint(jointDef); _revoluteJoint = _joint as b2RevoluteJoint; _revoluteJoint.m_localAnchor1.SetV(localAnchor1); _revoluteJoint.m_localAnchor2.SetV(localAnchor2); _revoluteJoint.GetBodyA().SetAwake(true); _revoluteJoint.GetBodyB().SetAwake(true); }
public Car() { m_hz = 4.0f; m_zeta = 0.7f; m_speed = 50.0f; b2Body ground = null; { b2BodyDef bd = new b2BodyDef(); ground = m_world.CreateBody(bd); b2EdgeShape shape = new b2EdgeShape(); b2FixtureDef fd = new b2FixtureDef(); fd.shape = shape; fd.density = 0.0f; fd.friction = 0.6f; shape.Set(new b2Vec2(-20.0f, 0.0f), new b2Vec2(20.0f, 0.0f)); ground.CreateFixture(fd); float[] hs = { 0.25f, 1.0f, 4.0f, 0.0f, 0.0f, -1.0f, -2.0f, -2.0f, -1.25f, 0.0f }; float x = 20.0f, y1 = 0.0f, dx = 5.0f; for (int i = 0; i < 10; ++i) { float y2 = hs[i]; shape.Set(new b2Vec2(x, y1), new b2Vec2(x + dx, y2)); ground.CreateFixture(fd); y1 = y2; x += dx; } for (int i = 0; i < 10; ++i) { float y2 = hs[i]; shape.Set(new b2Vec2(x, y1), new b2Vec2(x + dx, y2)); ground.CreateFixture(fd); y1 = y2; x += dx; } shape.Set(new b2Vec2(x, 0.0f), new b2Vec2(x + 40.0f, 0.0f)); ground.CreateFixture(fd); x += 80.0f; shape.Set(new b2Vec2(x, 0.0f), new b2Vec2(x + 40.0f, 0.0f)); ground.CreateFixture(fd); x += 40.0f; shape.Set(new b2Vec2(x, 0.0f), new b2Vec2(x + 10.0f, 5.0f)); ground.CreateFixture(fd); x += 20.0f; shape.Set(new b2Vec2(x, 0.0f), new b2Vec2(x + 40.0f, 0.0f)); ground.CreateFixture(fd); x += 40.0f; shape.Set(new b2Vec2(x, 0.0f), new b2Vec2(x, 20.0f)); ground.CreateFixture(fd); } // Teeter { b2BodyDef bd = new b2BodyDef(); bd.position.Set(140.0f, 1.0f); bd.type = b2BodyType.b2_dynamicBody; b2Body body = m_world.CreateBody(bd); b2PolygonShape box = new b2PolygonShape(); box.SetAsBox(10.0f, 0.25f); body.CreateFixture(box, 1.0f); b2RevoluteJointDef jd = new b2RevoluteJointDef(); jd.Initialize(ground, body, body.Position); jd.lowerAngle = -8.0f * b2Settings.b2_pi / 180.0f; jd.upperAngle = 8.0f * b2Settings.b2_pi / 180.0f; jd.enableLimit = true; m_world.CreateJoint(jd); body.ApplyAngularImpulse(100.0f); } // Bridge { int N = 20; b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(1.0f, 0.125f); b2FixtureDef fd = new b2FixtureDef(); fd.shape = shape; fd.density = 1.0f; fd.friction = 0.6f; b2RevoluteJointDef jd = new b2RevoluteJointDef(); b2Body prevBody = ground; for (int i = 0; i < N; ++i) { b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(161.0f + 2.0f * i, -0.125f); b2Body body = m_world.CreateBody(bd); body.CreateFixture(fd); b2Vec2 anchor = new b2Vec2(160.0f + 2.0f * i, -0.125f); jd.Initialize(prevBody, body, anchor); m_world.CreateJoint(jd); prevBody = body; } b2Vec2 anchor1 = new b2Vec2(160.0f + 2.0f * N, -0.125f); jd.Initialize(prevBody, ground, anchor1); m_world.CreateJoint(jd); } // Boxes { b2PolygonShape box = new b2PolygonShape(); box.SetAsBox(0.5f, 0.5f); b2Body body = null; b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(230.0f, 0.5f); body = m_world.CreateBody(bd); body.CreateFixture(box, 0.5f); bd.position.Set(230.0f, 1.5f); body = m_world.CreateBody(bd); body.CreateFixture(box, 0.5f); bd.position.Set(230.0f, 2.5f); body = m_world.CreateBody(bd); body.CreateFixture(box, 0.5f); bd.position.Set(230.0f, 3.5f); body = m_world.CreateBody(bd); body.CreateFixture(box, 0.5f); bd.position.Set(230.0f, 4.5f); body = m_world.CreateBody(bd); body.CreateFixture(box, 0.5f); } // Car { b2PolygonShape chassis = new b2PolygonShape(); b2Vec2[] vertices = new b2Vec2[8]; vertices[0].Set(-1.5f, -0.5f); vertices[1].Set(1.5f, -0.5f); vertices[2].Set(1.5f, 0.0f); vertices[3].Set(0.0f, 0.9f); vertices[4].Set(-1.15f, 0.9f); vertices[5].Set(-1.5f, 0.2f); chassis.Set(vertices, 6); b2CircleShape circle = new b2CircleShape(); circle.Radius = 0.4f; b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(0.0f, 1.0f); m_car = m_world.CreateBody(bd); m_car.CreateFixture(chassis, 1.0f); b2FixtureDef fd = new b2FixtureDef(); fd.shape = circle; fd.density = 1.0f; fd.friction = 0.9f; bd.position.Set(-1.0f, 0.35f); m_wheel1 = m_world.CreateBody(bd); m_wheel1.CreateFixture(fd); bd.position.Set(1.0f, 0.4f); m_wheel2 = m_world.CreateBody(bd); m_wheel2.CreateFixture(fd); b2WheelJointDef jd = new b2WheelJointDef(); b2Vec2 axis = new b2Vec2(0.0f, 1.0f); jd.Initialize(m_car, m_wheel1, m_wheel1.Position, axis); jd.motorSpeed = 0.0f; jd.maxMotorTorque = 20.0f; jd.enableMotor = true; jd.frequencyHz = m_hz; jd.dampingRatio = m_zeta; m_spring1 = (b2WheelJoint)m_world.CreateJoint(jd); jd.Initialize(m_car, m_wheel2, m_wheel2.Position, axis); jd.motorSpeed = 0.0f; jd.maxMotorTorque = 10.0f; jd.enableMotor = false; jd.frequencyHz = m_hz; jd.dampingRatio = m_zeta; m_spring2 = (b2WheelJoint)m_world.CreateJoint(jd); } }
public CircleStress() { b2Body leftWall = null; b2Body rightWall = null; { // Ground b2PolygonShape sd = new b2PolygonShape(); sd.SetAsBox(50.0f, 10.0f); b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_staticBody; bd.position = new b2Vec2(0.0f, -10.0f); b2Body b = m_world.CreateBody(bd); b2FixtureDef fd = new b2FixtureDef(); fd.shape = sd; fd.friction = 1.0f; b.CreateFixture(fd); // Walls sd.SetAsBox(3.0f, 50.0f); bd = new b2BodyDef(); bd.position = new b2Vec2(45.0f, 25.0f); rightWall = m_world.CreateBody(bd); rightWall.CreateFixture(sd, 0); bd.position = new b2Vec2(-45.0f, 25.0f); leftWall = m_world.CreateBody(bd); leftWall.CreateFixture(sd, 0); // Corners bd = new b2BodyDef(); sd.SetAsBox(20.0f, 3.0f); bd.angle = (float)(-Math.PI / 4.0); bd.position = new b2Vec2(-35f, 8.0f); b2Body myBod = m_world.CreateBody(bd); myBod.CreateFixture(sd, 0); bd.angle = (float)(Math.PI / 4.0); bd.position = new b2Vec2(35f, 8.0f); myBod = m_world.CreateBody(bd); myBod.CreateFixture(sd, 0); // top sd.SetAsBox(50.0f, 10.0f); bd.type = b2BodyType.b2_staticBody; bd.angle = 0; bd.position = new b2Vec2(0.0f, 75.0f); b = m_world.CreateBody(bd); fd.shape = sd; fd.friction = 1.0f; b.CreateFixture(fd); } { b2CircleShape cd; b2FixtureDef fd = new b2FixtureDef(); b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; int numPieces = 5; float radius = 6f; bd.position = new b2Vec2(0.0f, 10.0f); b2Body body = m_world.CreateBody(bd); for (int i = 0; i < numPieces; i++) { cd = new b2CircleShape(); cd.Radius = 1.2f; fd.shape = cd; fd.density = 25; fd.friction = .1f; fd.restitution = .9f; float xPos = radius * (float)Math.Cos(2f * Math.PI * (i / (float)(numPieces))); float yPos = radius * (float)Math.Sin(2f * Math.PI * (i / (float)(numPieces))); cd.Position.Set(xPos, yPos); body.CreateFixture(fd); } body.SetBullet(false); b2RevoluteJointDef rjd = new b2RevoluteJointDef(); rjd.Initialize(body, m_groundBody, body.Position); rjd.motorSpeed = (float)Math.PI; rjd.maxMotorTorque = 1000000.0f; rjd.enableMotor = true; joint = (b2RevoluteJoint)m_world.CreateJoint(rjd); } { int loadSize = 41; for (int j = 0; j < 15; j++) { for (int i = 0; i < loadSize; i++) { b2CircleShape circ = new b2CircleShape(); b2BodyDef bod = new b2BodyDef(); bod.type = b2BodyType.b2_dynamicBody; circ.Radius = 1.0f + (i % 2 == 0 ? 1.0f : -1.0f) * .5f * Rand.RandomFloat(.5f, 1f); b2FixtureDef fd2 = new b2FixtureDef(); fd2.shape = circ; fd2.density = circ.Radius * 1.5f; fd2.friction = 0.5f; fd2.restitution = 0.7f; float xPos = -39f + 2 * i; float yPos = 50f + j; bod.position = new b2Vec2(xPos, yPos); b2Body myBody = m_world.CreateBody(bod); myBody.CreateFixture(fd2); } } } m_world.Gravity = new b2Vec2(0, -50); }
public RopeJoint() { b2Body ground; { b2BodyDef bd = new b2BodyDef(); ground = m_world.CreateBody(bd); b2EdgeShape shape = new b2EdgeShape(); shape.Set(new b2Vec2(-40.0f, 0.0f), new b2Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(0.5f, 0.125f); b2FixtureDef fd = new b2FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.friction = 0.2f; fd.filter.categoryBits = 0x0001; fd.filter.maskBits = 0xFFFF & ~0x0002; b2RevoluteJointDef jd = new b2RevoluteJointDef(); jd.CollideConnected = false; const int N = 10; const float y = 15.0f; m_ropeDef.localAnchorA.Set(0.0f, y); b2Body prevBody = ground; for (int i = 0; i < N; ++i) { b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(0.5f + 1.0f * i, y); if (i == N - 1) { shape.SetAsBox(1.5f, 1.5f); fd.density = 100.0f; fd.filter.categoryBits = 0x0002; bd.position.Set(1.0f * i, y); bd.angularDamping = 0.4f; } b2Body body = m_world.CreateBody(bd); body.CreateFixture(fd); b2Vec2 anchor = new b2Vec2(i, y); jd.Initialize(prevBody, body, anchor); m_world.CreateJoint(jd); prevBody = body; } m_ropeDef.localAnchorB.SetZero(); float extraLength = 0.01f; m_ropeDef.maxLength = N - 1.0f + extraLength; m_ropeDef.BodyB = prevBody; } { m_ropeDef.BodyA = ground; m_rope = m_world.CreateJoint(m_ropeDef); } }
public override Tensor Reset() { State = new Tensor(ObservationSpace.Shape); Destroy(); contact_detector = new ContactDetector(this); world.SetContactListener(contact_detector); game_over = false; prev_shaping = float.NaN; var W = VIEWPORT_W / SCALE; var H = VIEWPORT_H / SCALE; // terrain var CHUNKS = 11; var height = Rng.NextFloat(0.0f, H / 2.0f, CHUNKS + 1); var chunk_x = Enumerable.Range(0, CHUNKS).Select(i => W / (CHUNKS - 1) * i).ToArray(); helipad_x1 = chunk_x[(int)Math.Floor(CHUNKS / 2.0) - 1]; helipad_x2 = chunk_x[(int)Math.Floor(CHUNKS / 2.0) + 1]; helipad_y = H / 4; height[(int)Math.Floor(CHUNKS / 2.0) - 2] = helipad_y; height[(int)Math.Floor(CHUNKS / 2.0) - 1] = helipad_y; height[(int)Math.Floor(CHUNKS / 2.0) + 0] = helipad_y; height[(int)Math.Floor(CHUNKS / 2.0) + 1] = helipad_y; height[(int)Math.Floor(CHUNKS / 2.0) + 2] = helipad_y; var smooth_y = Enumerable.Range(0, CHUNKS).Select(i => 0.33f * (height[(CHUNKS + i - 1) % CHUNKS] + height[i + 0] + height[i + 1])).ToArray(); moon = world.CreateStaticBody(new b2FixtureDef() { shape = new b2EdgeShape().Set(new b2Vec2(0, 0), new b2Vec2(W, 0)) }); sky_polys.Clear(); for (int i = 0; i < CHUNKS - 1; ++i) { var p1 = new float[] { chunk_x[i], smooth_y[i] }; var p2 = new float[] { chunk_x[i + 1], smooth_y[i + 1] }; moon.CreateFixture(new b2FixtureDef() { shape = new b2EdgeShape().Set(new b2Vec2((float)p1[0], (float)p1[1]), new b2Vec2((float)p2[0], (float)p2[1])), density = 0, friction = 0.1f }); sky_polys.Add(new List <float[]> { p1, p2, new[] { p2[0], H }, new[] { p1[0], H } }); } moon.SetUserData(new CustomBodyData() { Color1 = new b2Vec3(0, 0, 0), Color2 = new b2Vec3(0, 0, 0) }); var initial_y = VIEWPORT_H / SCALE; lander = world.CreateDynamicBody(new b2Vec2(VIEWPORT_W / SCALE / 2, initial_y), 0.0f, new b2FixtureDef() { shape = new b2PolygonShape().Set(LANDER_POLY.Select(p => new b2Vec2(p[0] / SCALE, p[1] / SCALE)).ToArray()), density = 5.0f, friction = 0.1f, filter = new b2Filter() { categoryBits = 0x0010, maskBits = 0x001 }, // collide only with ground restitution = 0.0f } // 0.99 bouncy ); lander.SetUserData(new CustomBodyData() { Color1 = new b2Vec3(0.5f, 0.4f, 0.9f), Color2 = new b2Vec3(0.3f, 0.3f, 0.5f) }); lander.ApplyForceToCenter(new b2Vec2((float)Rng.NextFloat(-INITIAL_RANDOM, INITIAL_RANDOM), (float)Rng.NextFloat(-INITIAL_RANDOM, INITIAL_RANDOM)), true); legs.Clear(); foreach (int i in new[] { -1, +1 }) { var leg = world.CreateDynamicBody( new b2Vec2(VIEWPORT_W / SCALE / 2 - i * LEG_AWAY / SCALE, initial_y), i * 0.05f, new b2FixtureDef() { shape = new b2PolygonShape().SetAsBox(LEG_W / SCALE, LEG_H / SCALE), density = 1.0f, restitution = 0.0f, filter = new b2Filter() { categoryBits = 0x0020, maskBits = 0x001 } } ); leg.SetUserData(new CustomBodyData() { Color1 = new b2Vec3(0.5f, 0.4f, 0.9f), Color2 = new b2Vec3(0.3f, 0.3f, 0.5f) }); var rjd = new b2RevoluteJointDef() { bodyA = lander, bodyB = leg, localAnchorA = new b2Vec2(0, 0), localAnchorB = new b2Vec2(i * LEG_AWAY / SCALE, LEG_DOWN / SCALE), enableMotor = true, enableLimit = true, maxMotorTorque = LEG_SPRING_TORQUE, motorSpeed = +0.3f * i // low enough not to jump back into the sky }; if (i == -1) { rjd.lowerAngle = +0.9f - 0.5f; // Yes, the most esoteric numbers here, angles legs have freedom to travel within rjd.upperAngle = +0.9f; } else { rjd.lowerAngle = -0.9f; rjd.upperAngle = -0.9f + 0.5f; } world.CreateJoint(rjd); legs.Add(leg); } drawlist = new List <b2Body> { lander }; drawlist = drawlist.Concat(legs).ToList(); Step(continuous ? new Tensor(new[] { 0.0f, 0.0f }, new Shape(2)) : new Tensor(new[] { 0.0f }, new Shape(1)), out var observation, out var reward); return(observation); }
public Revolute() { b2Body ground; { b2BodyDef bd = new b2BodyDef(); ground = m_world.CreateBody(bd); b2EdgeShape shape = new b2EdgeShape(); shape.Set(new b2Vec2(-40.0f, 0.0f), new b2Vec2(40.0f, 0.0f)); b2FixtureDef fd = new b2FixtureDef(); fd.shape = shape; //fd.filter.categoryBits = 2; ground.CreateFixture(fd); } { b2CircleShape shape = new b2CircleShape(); shape.Radius = 0.5f; b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; b2RevoluteJointDef rjd = new b2RevoluteJointDef(); bd.position.Set(-10.0f, 20.0f); b2Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 5.0f); float w = 100.0f; body.AngularVelocity = w; body.LinearVelocity = new b2Vec2(-8.0f * w, 0.0f); rjd.Initialize(ground, body, new b2Vec2(-10.0f, 12.0f)); rjd.motorSpeed = 1.0f * b2Settings.b2_pi; rjd.maxMotorTorque = 10000.0f; rjd.enableMotor = false; rjd.lowerAngle = -0.25f * b2Settings.b2_pi; rjd.upperAngle = 0.5f * b2Settings.b2_pi; rjd.enableLimit = true; rjd.CollideConnected = true; m_joint = (b2RevoluteJoint)m_world.CreateJoint(rjd); } { b2CircleShape circle_shape = new b2CircleShape(); circle_shape.Radius = 3.0f; b2BodyDef circle_bd = new b2BodyDef(); circle_bd.type = b2BodyType.b2_dynamicBody; circle_bd.position.Set(5.0f, 30.0f); b2FixtureDef fd = new b2FixtureDef(); fd.density = 5.0f; fd.filter.maskBits = 1; fd.shape = circle_shape; m_ball = m_world.CreateBody(circle_bd); m_ball.CreateFixture(fd); b2PolygonShape polygon_shape = new b2PolygonShape(); polygon_shape.SetAsBox(10.0f, 0.2f, new b2Vec2(-10.0f, 0.0f), 0.0f); b2BodyDef polygon_bd = new b2BodyDef(); polygon_bd.position.Set(20.0f, 10.0f); polygon_bd.type = b2BodyType.b2_dynamicBody; polygon_bd.bullet = true; b2Body polygon_body = m_world.CreateBody(polygon_bd); polygon_body.CreateFixture(polygon_shape, 2.0f); b2RevoluteJointDef rjd = new b2RevoluteJointDef(); rjd.Initialize(ground, polygon_body, new b2Vec2(20.0f, 10.0f)); rjd.lowerAngle = -0.25f * b2Settings.b2_pi; rjd.upperAngle = 0.0f * b2Settings.b2_pi; rjd.enableLimit = true; m_world.CreateJoint(rjd); } // Tests mass computation of a small object far from the origin { b2BodyDef bodyDef = new b2BodyDef(); bodyDef.type = b2BodyType.b2_dynamicBody; b2Body body = m_world.CreateBody(bodyDef); b2PolygonShape polyShape = new b2PolygonShape(); b2Vec2[] verts = new b2Vec2[3]; verts[0].Set(17.63f, 36.31f); verts[1].Set(17.52f, 36.69f); verts[2].Set(17.19f, 36.36f); polyShape.Set(verts, 3); b2FixtureDef polyFixtureDef = new b2FixtureDef(); polyFixtureDef.shape = polyShape; polyFixtureDef.density = 1; body.CreateFixture(polyFixtureDef); //assertion hits inside here } }
public DumpShell() { b2Vec2 g = new b2Vec2(0.000000000000000e+00f, 0.000000000000000e+00f); m_world.Gravity = g; b2Body[] bodies = new b2Body[3]; b2Joint[] joints = new b2Joint[2]; { b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(1.304347801208496e+01f, 2.500000000000000e+00f); bd.angle = 0.000000000000000e+00f; bd.linearVelocity.Set(0.000000000000000e+00f, 0.000000000000000e+00f); bd.angularVelocity = 0.000000000000000e+00f; bd.linearDamping = 5.000000000000000e-01f; bd.angularDamping = 5.000000000000000e-01f; bd.allowSleep = true; bd.awake = true; bd.fixedRotation = false; bd.bullet = false; bd.active = true; bd.gravityScale = 1.000000000000000e+00f; bodies[0] = m_world.CreateBody(bd); { b2FixtureDef fd = new b2FixtureDef(); fd.friction = 1.000000000000000e+00f; fd.restitution = 5.000000000000000e-01f; fd.density = 1.000000000000000e+01f; fd.isSensor = false; fd.filter.categoryBits = 1; fd.filter.maskBits = 65535; fd.filter.groupIndex = 0; b2PolygonShape shape = new b2PolygonShape(); b2Vec2[] vs = new b2Vec2[8]; vs[0].Set(-6.900000095367432e+00f, -3.000000119209290e-01f); vs[1].Set(2.000000029802322e-01f, -3.000000119209290e-01f); vs[2].Set(2.000000029802322e-01f, 2.000000029802322e-01f); vs[3].Set(-6.900000095367432e+00f, 2.000000029802322e-01f); shape.Set(vs, 4); fd.shape = shape; bodies[0].CreateFixture(fd); } } { b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(8.478260636329651e-01f, 2.500000000000000e+00f); bd.angle = 0.000000000000000e+00f; bd.linearVelocity.Set(0.000000000000000e+00f, 0.000000000000000e+00f); bd.angularVelocity = 0.000000000000000e+00f; bd.linearDamping = 5.000000000000000e-01f; bd.angularDamping = 5.000000000000000e-01f; bd.allowSleep = true; bd.awake = true; bd.fixedRotation = false; bd.bullet = false; bd.active = true; bd.gravityScale = 1.000000000000000e+00f; bodies[1] = m_world.CreateBody(bd); { b2FixtureDef fd = new b2FixtureDef(); fd.friction = 1.000000000000000e+00f; fd.restitution = 5.000000000000000e-01f; fd.density = 1.000000000000000e+01f; fd.isSensor = false; fd.filter.categoryBits = 1; fd.filter.maskBits = 65535; fd.filter.groupIndex = 0; b2PolygonShape shape = new b2PolygonShape(); b2Vec2[] vs = new b2Vec2[8]; vs[0].Set(-3.228000104427338e-01f, -2.957000136375427e-01f); vs[1].Set(6.885900020599365e+00f, -3.641000092029572e-01f); vs[2].Set(6.907599925994873e+00f, 3.271999955177307e-01f); vs[3].Set(-3.228000104427338e-01f, 2.825999855995178e-01f); shape.Set(vs, 4); fd.shape = shape; bodies[1].CreateFixture(fd); } } { b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_staticBody; bd.position.Set(0.000000000000000e+00f, 0.000000000000000e+00f); bd.angle = 0.000000000000000e+00f; bd.linearVelocity.Set(0.000000000000000e+00f, 0.000000000000000e+00f); bd.angularVelocity = 0.000000000000000e+00f; bd.linearDamping = 0.000000000000000e+00f; bd.angularDamping = 0.000000000000000e+00f; bd.allowSleep = true; bd.awake = true; bd.fixedRotation = false; bd.bullet = false; bd.active = true; bd.gravityScale = 1.000000000000000e+00f; bodies[2] = m_world.CreateBody(bd); { b2FixtureDef fd = new b2FixtureDef(); fd.friction = 1.000000000000000e+01f; fd.restitution = 0.000000000000000e+00f; fd.density = 0.000000000000000e+00f; fd.isSensor = false; fd.filter.categoryBits = 1; fd.filter.maskBits = 65535; fd.filter.groupIndex = 0; b2EdgeShape shape = new b2EdgeShape(); shape.Radius = 9.999999776482582e-03f; shape.Vertex0 = new b2Vec2(0.000000000000000e+00f, 0.000000000000000e+00f); shape.Vertex1 = new b2Vec2(4.452173995971680e+01f, 1.669565200805664e+01f); shape.Vertex2 = new b2Vec2(4.452173995971680e+01f, 0.000000000000000e+00f); shape.Vertex3 = new b2Vec2(0.000000000000000e+00f, 0.000000000000000e+00f); shape.HasVertex0 = false; shape.HasVertex3 = false; fd.shape = shape; bodies[2].CreateFixture(fd); } { b2FixtureDef fd = new b2FixtureDef(); fd.friction = 1.000000000000000e+01f; fd.restitution = 0.000000000000000e+00f; fd.density = 0.000000000000000e+00f; fd.isSensor = false; fd.filter.categoryBits = 1; fd.filter.maskBits = 65535; fd.filter.groupIndex = 0; b2EdgeShape shape = new b2EdgeShape(); shape.Radius = 9.999999776482582e-03f; shape.Vertex0 = new b2Vec2(0.000000000000000e+00f, 0.000000000000000e+00f); shape.Vertex1 = new b2Vec2(0.000000000000000e+00f, 1.669565200805664e+01f); shape.Vertex2 = new b2Vec2(0.000000000000000e+00f, 0.000000000000000e+00f); shape.Vertex3 = new b2Vec2(0.000000000000000e+00f, 0.000000000000000e+00f); shape.HasVertex0 = false; shape.HasVertex3 = false; fd.shape = shape; bodies[2].CreateFixture(fd); } { b2FixtureDef fd = new b2FixtureDef(); fd.friction = 1.000000000000000e+01f; fd.restitution = 0.000000000000000e+00f; fd.density = 0.000000000000000e+00f; fd.isSensor = false; fd.filter.categoryBits = 1; fd.filter.maskBits = 65535; fd.filter.groupIndex = 0; b2EdgeShape shape = new b2EdgeShape(); shape.Radius = 9.999999776482582e-03f; shape.Vertex0 = new b2Vec2(0.000000000000000e+00f, 0.000000000000000e+00f); shape.Vertex1 = new b2Vec2(0.000000000000000e+00f, 1.669565200805664e+01f); shape.Vertex2 = new b2Vec2(4.452173995971680e+01f, 1.669565200805664e+01f); shape.Vertex3 = new b2Vec2(0.000000000000000e+00f, 0.000000000000000e+00f); shape.HasVertex0 = false; shape.HasVertex3 = false; fd.shape = shape; bodies[2].CreateFixture(fd); } { b2FixtureDef fd = new b2FixtureDef(); fd.friction = 1.000000000000000e+01f; fd.restitution = 0.000000000000000e+00f; fd.density = 0.000000000000000e+00f; fd.isSensor = false; fd.filter.categoryBits = 1; fd.filter.maskBits = 65535; fd.filter.groupIndex = 0; b2EdgeShape shape = new b2EdgeShape(); shape.Radius = 9.999999776482582e-03f; shape.Vertex0 = new b2Vec2(0.000000000000000e+00f, 0.000000000000000e+00f); shape.Vertex1 = new b2Vec2(0.000000000000000e+00f, 0.000000000000000e+00f); shape.Vertex2 = new b2Vec2(4.452173995971680e+01f, 0.000000000000000e+00f); shape.Vertex3 = new b2Vec2(0.000000000000000e+00f, 0.000000000000000e+00f); shape.HasVertex0 = false; shape.HasVertex3 = false; fd.shape = shape; bodies[2].CreateFixture(fd); } } { b2PrismaticJointDef jd = new b2PrismaticJointDef(); jd.BodyA = bodies[1]; jd.BodyB = bodies[0]; jd.CollideConnected = false; jd.localAnchorA.Set(0.000000000000000e+00f, 0.000000000000000e+00f); jd.localAnchorB.Set(-1.219565200805664e+01f, 0.000000000000000e+00f); jd.localAxisA.Set(-1.219565200805664e+01f, 0.000000000000000e+00f); jd.referenceAngle = 0.000000000000000e+00f; jd.enableLimit = true; jd.lowerTranslation = -2.000000000000000e+01f; jd.upperTranslation = 0.000000000000000e+00f; jd.enableMotor = true; jd.motorSpeed = 0.000000000000000e+00f; jd.maxMotorForce = 1.000000000000000e+01f; joints[0] = m_world.CreateJoint(jd); } { b2RevoluteJointDef jd = new b2RevoluteJointDef(); jd.BodyA = bodies[1]; jd.BodyB = bodies[2]; jd.CollideConnected = false; jd.localAnchorA.Set(0.000000000000000e+00f, 0.000000000000000e+00f); jd.localAnchorB.Set(8.478260636329651e-01f, 2.500000000000000e+00f); jd.referenceAngle = 0.000000000000000e+00f; jd.enableLimit = false; jd.lowerAngle = 0.000000000000000e+00f; jd.upperAngle = 0.000000000000000e+00f; jd.enableMotor = false; jd.motorSpeed = 0.000000000000000e+00f; jd.maxMotorTorque = 0.000000000000000e+00f; joints[1] = m_world.CreateJoint(jd); } }
public Dominos() { b2Body b1; { b2EdgeShape shape = new b2EdgeShape(); shape.Set(new b2Vec2(-40.0f, 0.0f), new b2Vec2(40.0f, 0.0f)); b2BodyDef bd = new b2BodyDef(); b1 = m_world.CreateBody(bd); b1.CreateFixture(shape, 0.0f); } { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(6.0f, 0.25f); b2BodyDef bd = new b2BodyDef(); bd.position.Set(-1.5f, 10.0f); b2Body ground = m_world.CreateBody(bd); ground.CreateFixture(shape, 0.0f); } { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(0.1f, 1.0f); b2FixtureDef fd = new b2FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.friction = 0.1f; for (int i = 0; i < 10; ++i) { b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(-6.0f + 1.0f * i, 11.25f); b2Body body = m_world.CreateBody(bd); body.CreateFixture(fd); } } { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(7.0f, 0.25f, b2Vec2.Zero, 0.3f); b2BodyDef bd = new b2BodyDef(); bd.position.Set(1.0f, 6.0f); b2Body ground = m_world.CreateBody(bd); ground.CreateFixture(shape, 0.0f); } b2Body b2; { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(0.25f, 1.5f); b2BodyDef bd = new b2BodyDef(); bd.position.Set(-7.0f, 4.0f); b2 = m_world.CreateBody(bd); b2.CreateFixture(shape, 0.0f); } b2Body b3; { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(6.0f, 0.125f); b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(-0.9f, 1.0f); bd.angle = -0.15f; b3 = m_world.CreateBody(bd); b3.CreateFixture(shape, 10.0f); } b2RevoluteJointDef jd = new b2RevoluteJointDef(); b2Vec2 anchor = new b2Vec2(); anchor.Set(-2.0f, 1.0f); jd.Initialize(b1, b3, anchor); jd.CollideConnected = true; m_world.CreateJoint(jd); b2Body b4; { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(0.25f, 0.25f); b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(-10.0f, 15.0f); b4 = m_world.CreateBody(bd); b4.CreateFixture(shape, 10.0f); } anchor.Set(-7.0f, 15.0f); jd.Initialize(b2, b4, anchor); m_world.CreateJoint(jd); b2Body b5; { b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(6.5f, 3.0f); b5 = m_world.CreateBody(bd); b2PolygonShape shape = new b2PolygonShape(); b2FixtureDef fd = new b2FixtureDef(); fd.shape = shape; fd.density = 10.0f; fd.friction = 0.1f; shape.SetAsBox(1.0f, 0.1f, new b2Vec2(0.0f, -0.9f), 0.0f); b5.CreateFixture(fd); shape.SetAsBox(0.1f, 1.0f, new b2Vec2(-0.9f, 0.0f), 0.0f); b5.CreateFixture(fd); shape.SetAsBox(0.1f, 1.0f, new b2Vec2(0.9f, 0.0f), 0.0f); b5.CreateFixture(fd); } anchor.Set(6.0f, 2.0f); jd.Initialize(b1, b5, anchor); m_world.CreateJoint(jd); b2Body b6; { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(1.0f, 0.1f); b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(6.5f, 4.1f); b6 = m_world.CreateBody(bd); b6.CreateFixture(shape, 30.0f); } anchor.Set(7.5f, 4.0f); jd.Initialize(b5, b6, anchor); m_world.CreateJoint(jd); b2Body b7; { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(0.1f, 1.0f); b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(7.4f, 1.0f); b7 = m_world.CreateBody(bd); b7.CreateFixture(shape, 10.0f); } b2DistanceJointDef djd = new b2DistanceJointDef(); djd.BodyA = b3; djd.BodyB = b7; djd.localAnchorA.Set(6.0f, 0.0f); djd.localAnchorB.Set(0.0f, -1.0f); b2Vec2 d = djd.BodyB.GetWorldPoint(djd.localAnchorB) - djd.BodyA.GetWorldPoint(djd.localAnchorA); djd.length = d.Length; m_world.CreateJoint(djd); { float radius = 0.2f; b2CircleShape shape = new b2CircleShape(); shape.Radius = radius; for (int i = 0; i < 4; ++i) { b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(5.9f + 2.0f * radius * i, 2.4f); b2Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 10.0f); } } }
public Bridge() { b2Body ground = null; { b2BodyDef bd = new b2BodyDef(); ground = m_world.CreateBody(bd); b2EdgeShape shape = new b2EdgeShape(); shape.Set(new b2Vec2(-40.0f, 0.0f), new b2Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(0.5f, 0.125f); b2FixtureDef fd = new b2FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.friction = 0.2f; b2RevoluteJointDef jd = new b2RevoluteJointDef(); b2Body prevBody = ground; for (int i = 0; i < e_count; ++i) { b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position = new b2Vec2(-14.5f + 1.0f * i, 5.0f); b2Body body = m_world.CreateBody(bd); body.CreateFixture(fd); b2Vec2 anchor = new b2Vec2(-15.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); m_world.CreateJoint(jd); if (i == (e_count >> 1)) { m_middle = body; } prevBody = body; } b2Vec2 anchor1 = new b2Vec2(-15.0f + 1.0f * e_count, 5.0f); jd.Initialize(prevBody, ground, anchor1); m_world.CreateJoint(jd); } for (int i = 0; i < 2; ++i) { b2Vec2[] vertices = new b2Vec2[3]; vertices[0].Set(-0.5f, 0.0f); vertices[1].Set(0.5f, 0.0f); vertices[2].Set(0.0f, 1.5f); b2PolygonShape shape = new b2PolygonShape(); shape.Set(vertices, 3); b2FixtureDef fd = new b2FixtureDef(); fd.shape = shape; fd.density = 1.0f; b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position = new b2Vec2(-8.0f + 8.0f * i, 12.0f); b2Body body = m_world.CreateBody(bd); body.CreateFixture(fd); } for (int i = 0; i < 3; ++i) { b2CircleShape shape = new b2CircleShape(); shape.Radius = 0.5f; b2FixtureDef fd = new b2FixtureDef(); fd.shape = shape; fd.density = 1.0f; b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(-6.0f + 6.0f * i, 10.0f); b2Body body = m_world.CreateBody(bd); body.CreateFixture(fd); } }
public Pinball() { // Ground body b2Body ground; { b2BodyDef bd = new b2BodyDef(); ground = m_world.CreateBody(bd); b2Vec2[] vs = new b2Vec2[5]; vs[0].Set(0.0f, -2.0f); vs[1].Set(8.0f, 6.0f); vs[2].Set(8.0f, 20.0f); vs[3].Set(-8.0f, 20.0f); vs[4].Set(-8.0f, 6.0f); b2ChainShape loop = new b2ChainShape(); loop.CreateLoop(vs, 5); b2FixtureDef fd = new b2FixtureDef(); fd.shape = loop; fd.density = 0.0f; ground.CreateFixture(fd); } // Flippers { b2Vec2 p1 = new b2Vec2(-2.0f, 0.0f); b2Vec2 p2 = new b2Vec2(2.0f, 0.0f); b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position = p1; b2Body leftFlipper = m_world.CreateBody(bd); bd.position = p2; b2Body rightFlipper = m_world.CreateBody(bd); b2PolygonShape box = new b2PolygonShape(); box.SetAsBox(1.75f, 0.1f); b2FixtureDef fd = new b2FixtureDef(); fd.shape = box; fd.density = 1.0f; leftFlipper.CreateFixture(fd); rightFlipper.CreateFixture(fd); b2RevoluteJointDef jd = new b2RevoluteJointDef(); jd.BodyA = ground; jd.localAnchorB.SetZero(); jd.enableMotor = true; jd.maxMotorTorque = 1000.0f; jd.enableLimit = true; jd.motorSpeed = 0.0f; jd.localAnchorA = p1; jd.BodyB = leftFlipper; jd.lowerAngle = -30.0f * b2Settings.b2_pi / 180.0f; jd.upperAngle = 5.0f * b2Settings.b2_pi / 180.0f; m_leftJoint = (b2RevoluteJoint)m_world.CreateJoint(jd); jd.motorSpeed = 0.0f; jd.localAnchorA = p2; jd.BodyB = rightFlipper; jd.lowerAngle = -5.0f * b2Settings.b2_pi / 180.0f; jd.upperAngle = 30.0f * b2Settings.b2_pi / 180.0f; m_rightJoint = (b2RevoluteJoint)m_world.CreateJoint(jd); } // Circle character { b2BodyDef bd = new b2BodyDef(); bd.position.Set(1.0f, 15.0f); bd.type = b2BodyType.b2_dynamicBody; bd.bullet = true; m_ball = m_world.CreateBody(bd); b2CircleShape shape = new b2CircleShape(); shape.Radius = 0.2f; b2FixtureDef fd = new b2FixtureDef(); fd.shape = shape; fd.density = 1.0f; m_ball.CreateFixture(fd); } m_button = false; }
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(b2RevoluteJointDef obj) { return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr); }
public void CreateLeg(float s, b2Vec2 wheelAnchor) { b2Vec2 p1 = new b2Vec2(5.4f * s, -6.1f); b2Vec2 p2 = new b2Vec2(7.2f * s, -1.2f); b2Vec2 p3 = new b2Vec2(4.3f * s, -1.9f); b2Vec2 p4 = new b2Vec2(3.1f * s, 0.8f); b2Vec2 p5 = new b2Vec2(6.0f * s, 1.5f); b2Vec2 p6 = new b2Vec2(2.5f * s, 3.7f); b2FixtureDef fd1 = new b2FixtureDef(); b2FixtureDef fd2 = new b2FixtureDef(); fd1.filter.groupIndex = -1; fd2.filter.groupIndex = -1; fd1.density = 1.0f; fd2.density = 1.0f; b2PolygonShape poly1 = new b2PolygonShape(); b2PolygonShape poly2 = new b2PolygonShape(); if (s > 0.0f) { b2Vec2[] vertices = new b2Vec2[3]; vertices[0] = p1; vertices[1] = p2; vertices[2] = p3; poly1.Set(vertices, 3); vertices[0] = b2Vec2.Zero; vertices[1] = p5 - p4; vertices[2] = p6 - p4; poly2.Set(vertices, 3); } else { b2Vec2[] vertices = new b2Vec2[3]; vertices[0] = p1; vertices[1] = p3; vertices[2] = p2; poly1.Set(vertices, 3); vertices[0] = b2Vec2.Zero; vertices[1] = p6 - p4; vertices[2] = p5 - p4; poly2.Set(vertices, 3); } fd1.shape = poly1; fd2.shape = poly2; b2BodyDef bd1 = new b2BodyDef(); b2BodyDef bd2 = new b2BodyDef(); bd1.type = b2BodyType.b2_dynamicBody; bd2.type = b2BodyType.b2_dynamicBody; bd1.position = m_offset; bd2.position = p4 + m_offset; bd1.angularDamping = 10.0f; bd2.angularDamping = 10.0f; b2Body body1 = m_world.CreateBody(bd1); b2Body body2 = m_world.CreateBody(bd2); body1.CreateFixture(fd1); body2.CreateFixture(fd2); b2DistanceJointDef djd = new b2DistanceJointDef(); // Using a soft distance constraint can reduce some jitter. // It also makes the structure seem a bit more fluid by // acting like a suspension system. djd.dampingRatio = 0.5f; djd.frequencyHz = 10.0f; djd.Initialize(body1, body2, p2 + m_offset, p5 + m_offset); m_world.CreateJoint(djd); djd.Initialize(body1, body2, p3 + m_offset, p4 + m_offset); m_world.CreateJoint(djd); djd.Initialize(body1, m_wheel, p3 + m_offset, wheelAnchor + m_offset); m_world.CreateJoint(djd); djd.Initialize(body2, m_wheel, p6 + m_offset, wheelAnchor + m_offset); m_world.CreateJoint(djd); b2RevoluteJointDef rjd = new b2RevoluteJointDef(); rjd.Initialize(body2, m_chassis, p4 + m_offset); m_world.CreateJoint(rjd); }
public TheoJansen() { m_offset.Set(0.0f, 8.0f); m_motorSpeed = 2.0f; m_motorOn = true; b2Vec2 pivot = new b2Vec2(0.0f, 0.8f); // Ground { b2BodyDef bd = new b2BodyDef(); b2Body ground = m_world.CreateBody(bd); b2EdgeShape shape = new b2EdgeShape(); shape.Set(new b2Vec2(-50.0f, 0.0f), new b2Vec2(50.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); shape.Set(new b2Vec2(-50.0f, 0.0f), new b2Vec2(-50.0f, 10.0f)); ground.CreateFixture(shape, 0.0f); shape.Set(new b2Vec2(50.0f, 0.0f), new b2Vec2(50.0f, 10.0f)); ground.CreateFixture(shape, 0.0f); } // Balls for (int i = 0; i < 40; ++i) { b2CircleShape shape = new b2CircleShape(); shape.Radius = 0.25f; b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(-40.0f + 2.0f * i, 0.5f); b2Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 1.0f); } // Chassis { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(2.5f, 1.0f); b2FixtureDef sd = new b2FixtureDef(); sd.density = 1.0f; sd.shape = shape; sd.filter.groupIndex = -1; b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position = pivot + m_offset; m_chassis = m_world.CreateBody(bd); m_chassis.CreateFixture(sd); } { b2CircleShape shape = new b2CircleShape(); shape.Radius = 1.6f; b2FixtureDef sd = new b2FixtureDef(); sd.density = 1.0f; sd.shape = shape; sd.filter.groupIndex = -1; b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position = pivot + m_offset; m_wheel = m_world.CreateBody(bd); m_wheel.CreateFixture(sd); } { b2RevoluteJointDef jd = new b2RevoluteJointDef(); jd.Initialize(m_wheel, m_chassis, pivot + m_offset); jd.CollideConnected = false; jd.motorSpeed = m_motorSpeed; jd.maxMotorTorque = 400.0f; jd.enableMotor = m_motorOn; m_motorJoint = (b2RevoluteJoint)m_world.CreateJoint(jd); } b2Vec2 wheelAnchor = new b2Vec2(); wheelAnchor = pivot + new b2Vec2(0.0f, -0.8f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); m_wheel.SetTransform(m_wheel.Position, 120.0f * b2Settings.b2_pi / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); m_wheel.SetTransform(m_wheel.Position, -120.0f * b2Settings.b2_pi / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); }
public override Tensor Reset() { State = new Tensor(ObservationSpace.Shape); Destroy(); World.SetContactListener(contactDetector); game_over = false; prev_shaping = float.NaN; scroll = 0.0f; lidar_render = 0; GenerateTerrain(hardcore); GenerateClouds(); var init_x = TERRAIN_STEP * TERRAIN_STARTPAD / 2; var init_y = TERRAIN_HEIGHT + 2.1f * LEG_H; hull = World.CreateDynamicBody(new b2Vec2(init_x, init_y), 0, HULL_FD); hull.SetUserData(new CustomBodyData() { Color1 = new b2Vec3(0.5f, 0.4f, 0.9f), Color2 = new b2Vec3(0.3f, 0.3f, 0.5f) }); hull.ApplyForce(new b2Vec2((float)Rng.NextFloat(-INITIAL_RANDOM, INITIAL_RANDOM), 0), hull.GetWorldCenter(), true); foreach (float i in new[] { -1, +1 }) { var leg = World.CreateDynamicBody(new b2Vec2(init_x, init_y - LEG_H / 2 - LEG_DOWN), i * 0.05f, LEG_FD); leg.SetUserData(new CustomBodyData() { Color1 = new b2Vec3(0.6f - i / 10.0f, 0.3f - i / 10.0f, 0.5f - i / 10.0f), Color2 = new b2Vec3(0.4f - i / 10.0f, 0.2f - i / 10.0f, 0.3f - i / 10.0f) }); var rjd = new b2RevoluteJointDef(); rjd.bodyA = hull; rjd.bodyB = leg; rjd.localAnchorA = new b2Vec2(0, LEG_DOWN); rjd.localAnchorB = new b2Vec2(0, LEG_H / 2); rjd.enableMotor = true; rjd.enableLimit = true; rjd.maxMotorTorque = MOTORS_TORQUE; rjd.motorSpeed = i; rjd.lowerAngle = -0.8f; rjd.upperAngle = 1.1f; legs.Add(leg); joints.Add((b2RevoluteJoint)World.CreateJoint(rjd)); var lower = World.CreateDynamicBody(new b2Vec2(init_x, init_y - LEG_H * 3 / 2 - LEG_DOWN), i * 0.05f, LOWER_FD); lower.SetUserData(new CustomBodyData() { Color1 = new b2Vec3(0.6f - i / 10.0f, 0.3f - i / 10.0f, 0.5f - i / 10.0f), Color2 = new b2Vec3(0.4f - i / 10.0f, 0.2f - i / 10.0f, 0.3f - i / 10.0f) }); rjd = new b2RevoluteJointDef(); rjd.bodyA = leg; rjd.bodyB = lower; rjd.localAnchorA = new b2Vec2(0, -LEG_H / 2); rjd.localAnchorB = new b2Vec2(0, LEG_H / 2); rjd.enableMotor = true; rjd.enableLimit = true; rjd.maxMotorTorque = MOTORS_TORQUE; rjd.motorSpeed = 1; rjd.lowerAngle = -1.6f; rjd.upperAngle = -0.1f; legs.Add(lower); joints.Add((b2RevoluteJoint)World.CreateJoint(rjd)); } drawlist = terrain.Concat(legs).ToList(); drawlist.Add(hull); for (int i = 0; i < lidar.Length; ++i) { lidar[i] = new LidarCallback(); } Step(new Tensor(new[] { 0.0f, 0.0f, 0.0f, 0.0f }, ActionSpace.Shape), out var observation, out var reward); return(observation); }
public BodyTypes() { b2Body ground = null; { b2BodyDef bd = new b2BodyDef(); ground = m_world.CreateBody(bd); b2EdgeShape shape = new b2EdgeShape(); shape.Set(new b2Vec2(-20.0f, 0.0f), new b2Vec2(20.0f, 0.0f)); b2FixtureDef fd = new b2FixtureDef(); fd.shape = shape; ground.CreateFixture(fd); } // Define attachment { b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position = new b2Vec2(0.0f, 3.0f); m_attachment = m_world.CreateBody(bd); b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(0.5f, 2.0f); m_attachment.CreateFixture(shape, 2.0f); } // Define platform { b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position = new b2Vec2(-4.0f, 5.0f); m_platform = m_world.CreateBody(bd); b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(0.5f, 4.0f, new b2Vec2(4.0f, 0.0f), 0.5f * b2Settings.b2_pi); b2FixtureDef fd = new b2FixtureDef(); fd.shape = shape; fd.friction = 0.6f; fd.density = 2.0f; m_platform.CreateFixture(fd); b2RevoluteJointDef rjd = new b2RevoluteJointDef(); rjd.Initialize(m_attachment, m_platform, new b2Vec2(0.0f, 5.0f)); rjd.maxMotorTorque = 50.0f; rjd.enableMotor = true; m_world.CreateJoint(rjd); b2PrismaticJointDef pjd = new b2PrismaticJointDef(); pjd.Initialize(ground, m_platform, new b2Vec2(0.0f, 5.0f), new b2Vec2(1.0f, 0.0f)); pjd.maxMotorForce = 1000.0f; pjd.enableMotor = true; pjd.lowerTranslation = -10.0f; pjd.upperTranslation = 10.0f; pjd.enableLimit = true; m_world.CreateJoint(pjd); m_speed = 3.0f; } // Create a payload { b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position = new b2Vec2(0.0f, 8.0f); b2Body body = m_world.CreateBody(bd); b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(0.75f, 0.75f); b2FixtureDef fd = new b2FixtureDef(); fd.shape = shape; fd.friction = 0.6f; fd.density = 2.0f; body.CreateFixture(fd); } }
public SliderCrank() { b2Body ground; { b2BodyDef bd = new b2BodyDef(); ground = m_world.CreateBody(bd); b2EdgeShape shape = new b2EdgeShape(); shape.Set(new b2Vec2(-40.0f, 0.0f), new b2Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { b2Body prevBody = ground; // Define crank. { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(0.5f, 2.0f); b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(0.0f, 7.0f); b2Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 2.0f); b2RevoluteJointDef rjd = new b2RevoluteJointDef(); rjd.Initialize(prevBody, body, new b2Vec2(0.0f, 5.0f)); rjd.motorSpeed = 1.0f * b2Settings.b2_pi; rjd.maxMotorTorque = 10000.0f; rjd.enableMotor = true; m_joint1 = (b2RevoluteJoint)m_world.CreateJoint(rjd); prevBody = body; } // Define follower. { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(0.5f, 4.0f); b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(0.0f, 13.0f); b2Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 2.0f); b2RevoluteJointDef rjd = new b2RevoluteJointDef(); rjd.Initialize(prevBody, body, new b2Vec2(0.0f, 9.0f)); rjd.enableMotor = false; m_world.CreateJoint(rjd); prevBody = body; } // Define piston { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(1.5f, 1.5f); b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.fixedRotation = true; bd.position.Set(0.0f, 17.0f); b2Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 2.0f); b2RevoluteJointDef rjd = new b2RevoluteJointDef(); rjd.Initialize(prevBody, body, new b2Vec2(0.0f, 17.0f)); m_world.CreateJoint(rjd); b2PrismaticJointDef pjd = new b2PrismaticJointDef(); pjd.Initialize(ground, body, new b2Vec2(0.0f, 17.0f), new b2Vec2(0.0f, 1.0f)); pjd.maxMotorForce = 1000.0f; pjd.enableMotor = true; m_joint2 = (b2PrismaticJoint)m_world.CreateJoint(pjd); } // Create a payload { b2PolygonShape shape = new b2PolygonShape(); shape.SetAsBox(1.5f, 1.5f); b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; bd.position.Set(0.0f, 23.0f); b2Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 2.0f); } } }
public Gears() { b2Body ground = null; { b2BodyDef bd = new b2BodyDef(); ground = m_world.CreateBody(bd); b2EdgeShape shape = new b2EdgeShape(); shape.Set(new b2Vec2(50.0f, 0.0f), new b2Vec2(-50.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } // Gears co { b2CircleShape circle1 = new b2CircleShape(); circle1.Radius = 1.0f; b2PolygonShape box = new b2PolygonShape(); box.SetAsBox(0.5f, 5.0f); b2CircleShape circle2 = new b2CircleShape(); circle2.Radius = 2.0f; b2BodyDef bd1 = new b2BodyDef(); bd1.type = b2BodyType.b2_staticBody; bd1.position.Set(10.0f, 9.0f); b2Body body1 = m_world.CreateBody(bd1); body1.CreateFixture(circle1, 0.0f); b2BodyDef bd2 = new b2BodyDef(); bd2.type = b2BodyType.b2_dynamicBody; bd2.position.Set(10.0f, 8.0f); b2Body body2 = m_world.CreateBody(bd2); body2.CreateFixture(box, 5.0f); b2BodyDef bd3 = new b2BodyDef(); bd3.type = b2BodyType.b2_dynamicBody; bd3.position.Set(10.0f, 6.0f); b2Body body3 = m_world.CreateBody(bd3); body3.CreateFixture(circle2, 5.0f); b2RevoluteJointDef jd1 = new b2RevoluteJointDef(); jd1.Initialize(body2, body1, bd1.position); b2Joint joint1 = m_world.CreateJoint(jd1); b2RevoluteJointDef jd2 = new b2RevoluteJointDef(); jd2.Initialize(body2, body3, bd3.position); b2Joint joint2 = m_world.CreateJoint(jd2); b2GearJointDef jd4 = new b2GearJointDef(); jd4.BodyA = body1; jd4.BodyB = body3; jd4.joint1 = joint1; jd4.joint2 = joint2; jd4.ratio = circle2.Radius / circle1.Radius; m_world.CreateJoint(jd4); } { b2CircleShape circle1 = new b2CircleShape(); circle1.Radius = 1.0f; b2CircleShape circle2 = new b2CircleShape(); circle2.Radius = 2.0f; b2PolygonShape box = new b2PolygonShape(); box.SetAsBox(0.5f, 5.0f); b2BodyDef bd1 = new b2BodyDef(); bd1.type = b2BodyType.b2_dynamicBody; bd1.position.Set(-3.0f, 12.0f); b2Body body1 = m_world.CreateBody(bd1); body1.CreateFixture(circle1, 5.0f); b2RevoluteJointDef jd1 = new b2RevoluteJointDef(); jd1.BodyA = ground; jd1.BodyB = body1; jd1.localAnchorA = ground.GetLocalPoint(bd1.position); jd1.localAnchorB = body1.GetLocalPoint(bd1.position); jd1.referenceAngle = body1.Angle - ground.Angle; m_joint1 = (b2RevoluteJoint)m_world.CreateJoint(jd1); b2BodyDef bd2 = new b2BodyDef(); bd2.type = b2BodyType.b2_dynamicBody; bd2.position.Set(0.0f, 12.0f); b2Body body2 = m_world.CreateBody(bd2); body2.CreateFixture(circle2, 5.0f); b2RevoluteJointDef jd2 = new b2RevoluteJointDef(); jd2.Initialize(ground, body2, bd2.position); m_joint2 = (b2RevoluteJoint)m_world.CreateJoint(jd2); b2BodyDef bd3 = new b2BodyDef(); bd3.type = b2BodyType.b2_dynamicBody; bd3.position.Set(2.5f, 12.0f); b2Body body3 = m_world.CreateBody(bd3); body3.CreateFixture(box, 5.0f); b2PrismaticJointDef jd3 = new b2PrismaticJointDef(); jd3.Initialize(ground, body3, bd3.position, new b2Vec2(0.0f, 1.0f)); jd3.lowerTranslation = -5.0f; jd3.upperTranslation = 5.0f; jd3.enableLimit = true; m_joint3 = (b2PrismaticJoint)m_world.CreateJoint(jd3); b2GearJointDef jd4 = new b2GearJointDef(); jd4.BodyA = body1; jd4.BodyB = body2; jd4.joint1 = m_joint1; jd4.joint2 = m_joint2; jd4.ratio = circle2.Radius / circle1.Radius; m_joint4 = (b2GearJoint)m_world.CreateJoint(jd4); b2GearJointDef jd5 = new b2GearJointDef(); jd5.BodyA = body2; jd5.BodyB = body3; jd5.joint1 = m_joint2; jd5.joint2 = m_joint3; jd5.ratio = -1.0f / circle2.Radius; m_joint5 = (b2GearJoint)m_world.CreateJoint(jd5); } }
public Wheel( b2World b2world, double x, double y, double width, double length, bool revolving, bool powered ) { this.revolving = revolving; this.powered = powered; this.Initialize = car => { /* * wheel object * * pars: * * car - car this wheel belongs to * x - horizontal position in meters relative to car's center * y - vertical position in meters relative to car's center * width - width in meters * length - length in meters * revolving - does this wheel revolve when steering? * powered - is this wheel powered? */ var position = new double[] { x, y }; //this.car=pars.car; //this.revolving=pars.revolving; //this.powered=pars.powered; //initialize body var def = new b2BodyDef(); def.type = b2Body.b2_dynamicBody; def.position = car.body.GetWorldPoint(new b2Vec2(position[0], position[1])); def.angle = car.body.GetAngle(); this.body = b2world.CreateBody(def); //initialize shape var fixdef = new b2FixtureDef(); fixdef.density = 1; fixdef.isSensor = true; //wheel does not participate in collision calculations: resulting complications are unnecessary var fixdef_shape = new b2PolygonShape(); fixdef.shape = fixdef_shape; fixdef_shape.SetAsBox(width / 2, length / 2); body.CreateFixture(fixdef); var jointdef = new b2RevoluteJointDef(); //create joint to connect wheel to body if (revolving) { jointdef.Initialize(car.body, body, body.GetWorldCenter()); jointdef.enableMotor = false; //we'll be controlling the wheel's angle manually } else { jointdef.Initialize(car.body, body, body.GetWorldCenter() //, new b2Vec2(1, 0) ); jointdef.enableLimit = true; //jointdef.lowerTranslation = 0; //jointdef.upperTranslation = 0; } b2world.CreateJoint(jointdef); #region setAngle this.setAngle = (angle) => { /* * angle - wheel angle relative to car, in degrees */ body.SetAngle(car.body.GetAngle() + angle.DegreesToRadians()); }; #endregion #region getLocalVelocity Func <double[]> getLocalVelocity = delegate { /*returns get velocity vector relative to car */ var res = car.body.GetLocalVector(car.body.GetLinearVelocityFromLocalPoint(new b2Vec2(position[0], position[1]))); return(new double[] { res.x, res.y }); }; #endregion #region getDirectionVector Func <double[]> getDirectionVector = delegate { /* * returns a world unit vector pointing in the direction this wheel is moving */ if (getLocalVelocity()[1] > 0) { return(vectors.rotate(new double[] { 0, 1 }, body.GetAngle())); } else { return(vectors.rotate(new double[] { 0, -1 }, body.GetAngle())); } }; #endregion #region getKillVelocityVector Func <double[]> getKillVelocityVector = delegate { /* * substracts sideways velocity from this wheel's velocity vector and returns the remaining front-facing velocity vector */ var velocity = body.GetLinearVelocity(); var sideways_axis = getDirectionVector(); var dotprod = vectors.dot(new[] { velocity.x, velocity.y }, sideways_axis); return(new double[] { sideways_axis[0] * dotprod, sideways_axis[1] * dotprod }); }; #endregion #region killSidewaysVelocity this.killSidewaysVelocity = delegate { /* * removes all sideways velocity from this wheels velocity */ var kv = getKillVelocityVector(); body.SetLinearVelocity(new b2Vec2(kv[0], kv[1])); }; #endregion }; }