public override void Step(TestSettings settings) { base.Step(settings); PolygonShape shape = new PolygonShape(); shape.Set(m_points, e_count); m_debugDraw.DrawString("Press g to generate a new random convex hull"); m_debugDraw.DrawPolygon(shape.m_vertices, shape.m_count, Color.FromArgb(225, 225, 225)); for (int i = 0; i < e_count; ++i) { m_debugDraw.DrawPoint(m_points[i], 2.0f, Color.FromArgb(225, 128, 128)); //m_debugDraw.DrawString(m_points[i] + new Vec2(0.05f, 0.05f), "%d", i); } if (shape.Validate() == false) { m_textLine += 0; } if (m_auto) { Generate(); } }
public ApplyForce() { m_world.SetGravity(new Vec2(0.0f, 0.0f)); const float k_restitution = 0.4f; Body ground; { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 20.0f); ground = m_world.CreateBody(bd); EdgeShape shape = new EdgeShape(); FixtureDef sd = new FixtureDef(); sd.shape = shape; sd.Density = 0.0f; sd.restitution = k_restitution; // Left vertical shape.Set(new Vec2(-20.0f, -20.0f), new Vec2(-20.0f, 20.0f)); ground.CreateFixture(sd); // Right vertical shape.Set(new Vec2(20.0f, -20.0f), new Vec2(20.0f, 20.0f)); ground.CreateFixture(sd); // Top horizontal shape.Set(new Vec2(-20.0f, 20.0f), new Vec2(20.0f, 20.0f)); ground.CreateFixture(sd); // Bottom horizontal shape.Set(new Vec2(-20.0f, -20.0f), new Vec2(20.0f, -20.0f)); ground.CreateFixture(sd); } { Transform xf1 = new Transform(); xf1.q.Set(0.3524f * (float)Math.PI); xf1.p = xf1.q.GetXAxis(); Vec2[] vertices = new Vec2[3]; vertices[0] = Utilities.Mul(xf1, new Vec2(-1.0f, 0.0f)); vertices[1] = Utilities.Mul(xf1, new Vec2(1.0f, 0.0f)); vertices[2] = Utilities.Mul(xf1, new Vec2(0.0f, 0.5f)); PolygonShape poly1 = new PolygonShape(); poly1.Set(vertices, 3); FixtureDef sd1 = new FixtureDef(); sd1.shape = poly1; sd1.Density = 4.0f; Transform xf2 = new Transform(); xf2.q.Set(-0.3524f * (float)Math.PI); xf2.p = -xf2.q.GetXAxis(); vertices[0] = Utilities.Mul(xf2, new Vec2(-1.0f, 0.0f)); vertices[1] = Utilities.Mul(xf2, new Vec2(1.0f, 0.0f)); vertices[2] = Utilities.Mul(xf2, new Vec2(0.0f, 0.5f)); PolygonShape poly2 = new PolygonShape(); poly2.Set(vertices, 3); FixtureDef sd2 = new FixtureDef(); sd2.shape = poly2; sd2.Density = 2.0f; BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.angularDamping = 5.0f; bd.linearDamping = 0.1f; bd.Position.Set(0.0f, 2.0f); bd.angle = (float)Math.PI; bd.allowSleep = false; m_body = m_world.CreateBody(bd); m_body.CreateFixture(sd1); m_body.CreateFixture(sd2); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.5f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 1.0f; fd.friction = 0.3f; for (int i = 0; i < 10; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(0.0f, 5.0f + 1.54f * i); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); float gravity = 10.0f; float I = body.GetInertia(); float mass = body.GetMass(); // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m) float radius = (float)Math.Sqrt(2.0f * I / mass); FrictionJointDef jd = new FrictionJointDef(); jd.localAnchorA.SetZero(); jd.localAnchorB.SetZero(); jd.bodyA = ground; jd.bodyB = body; jd.collideConnected = true; jd.maxForce = mass * gravity; jd.maxTorque = mass * radius * gravity; m_world.CreateJoint(jd); } } }
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); } }
Bridge() { Body ground = null; { BodyDef bd = new BodyDef(); ground = m_world.CreateBody(bd); EdgeShape shape = new EdgeShape(); shape.Set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); shape.Density = 0; ground.CreateFixture(shape); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 20.0f; fd.friction = 0.2f; RevoluteJointDef jd = new RevoluteJointDef(); Body prevBody = ground; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(-14.5f + 1.0f * i, 5.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); Vec2 anchor = new Vec2(-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; } Vec2 anchor2 = new Vec2(-15.0f + 1.0f * e_count, 5.0f); jd.Initialize(prevBody, ground, anchor2); m_world.CreateJoint(jd); } for (int i = 0; i < 2; ++i) { Vec2[] vertices = new Vec2[3]; vertices[0].Set(-0.5f, 0.0f); vertices[1].Set(0.5f, 0.0f); vertices[2].Set(0.0f, 1.5f); PolygonShape shape = new PolygonShape(); shape.Set(vertices, 3); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 1.0f; BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(-8.0f + 8.0f * i, 12.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); } for (int i = 0; i < 3; ++i) { CircleShape shape = new CircleShape(); shape.m_radius = 0.5f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 1.0f; BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(-6.0f + 6.0f * i, 10.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); } }
public Revolute() { Body ground = null; { BodyDef bd = new BodyDef(); ground = m_world.CreateBody(bd); EdgeShape shape = new EdgeShape(); shape.Set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); FixtureDef fd = new FixtureDef(); fd.shape = shape; //fd.Filter.CategoryBits = 2; ground.CreateFixture(fd); } { CircleShape shape = new CircleShape(); shape.m_radius = 0.5f; shape.Density = 5; BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; RevoluteJointDef rjd = new RevoluteJointDef(); bd.Position.Set(-10.0f, 20.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(shape); float w = 100.0f; body.SetAngularVelocity(w); body.SetLinearVelocity(new Vec2(-8.0f * w, 0.0f)); rjd.Initialize(ground, body, new Vec2(-10.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); } { CircleShape circle_shape = new CircleShape(); circle_shape.m_radius = 3.0f; BodyDef circle_bd = new BodyDef(); circle_bd.type = BodyType._dynamicBody; circle_bd.Position.Set(5.0f, 30.0f); FixtureDef fd = new FixtureDef(); fd.Density = 5.0f; fd.Filter.MaskBits = 1; fd.shape = circle_shape; m_ball = m_world.CreateBody(circle_bd); m_ball.CreateFixture(fd); PolygonShape polygon_shape = new PolygonShape(); polygon_shape.SetAsBox(10.0f, 0.2f, new Vec2(-10.0f, 0.0f), 0.0f); polygon_shape.Density = 2; BodyDef polygon_bd = new BodyDef(); polygon_bd.Position.Set(20.0f, 10.0f); polygon_bd.type = BodyType._dynamicBody; polygon_bd.bullet = true; Body polygon_body = m_world.CreateBody(polygon_bd); polygon_body.CreateFixture(polygon_shape); RevoluteJointDef rjd = new RevoluteJointDef(); rjd.Initialize(ground, polygon_body, new Vec2(20.0f, 10.0f)); rjd.lowerAngle = -0.25f * (float)Math.PI; rjd.upperAngle = 0.0f * (float)Math.PI; rjd.enableLimit = true; m_world.CreateJoint(rjd); } // Tests mass computation of a small object far from the origin { BodyDef bodyDef = new BodyDef(); bodyDef.type = BodyType._dynamicBody; Body body = m_world.CreateBody(bodyDef); PolygonShape polyShape = new PolygonShape(); Vec2[] verts = new Vec2[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); FixtureDef polyFixtureDef = new FixtureDef(); polyFixtureDef.shape = polyShape; polyFixtureDef.Density = 1; body.CreateFixture(polyFixtureDef); //assertion hits inside here } }
public CollisionFiltering() { // Ground body { EdgeShape shape = new EdgeShape(); shape.Set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); FixtureDef sd = new FixtureDef(); sd.shape = shape; sd.friction = 0.3f; BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); ground.CreateFixture(sd); } // Small triangle Vec2[] vertices = new Vec2[3]; vertices[0].Set(-1.0f, 0.0f); vertices[1].Set(1.0f, 0.0f); vertices[2].Set(0.0f, 2.0f); PolygonShape polygon = new PolygonShape(); polygon.Set(vertices, 3); FixtureDef triangleShapeDef = new FixtureDef(); triangleShapeDef.shape = polygon; triangleShapeDef.Density = 1.0f; triangleShapeDef.Filter.GroupIndex = k_smallGroup; triangleShapeDef.Filter.CategoryBits = k_triangleCategory; triangleShapeDef.Filter.MaskBits = k_triangleMask; BodyDef triangleBodyDef = new BodyDef(); triangleBodyDef.type = BodyType._dynamicBody; triangleBodyDef.Position.Set(-5.0f, 2.0f); Body body1 = m_world.CreateBody(triangleBodyDef); body1.CreateFixture(triangleShapeDef); // Large triangle (recycle definitions) vertices[0] *= 2.0f; vertices[1] *= 2.0f; vertices[2] *= 2.0f; polygon.Set(vertices, 3); triangleShapeDef.Filter.GroupIndex = k_largeGroup; triangleBodyDef.Position.Set(-5.0f, 6.0f); triangleBodyDef.fixedRotation = true; // look at me! Body body2 = m_world.CreateBody(triangleBodyDef); body2.CreateFixture(triangleShapeDef); { BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(-5.0f, 10.0f); Body body = m_world.CreateBody(bd); PolygonShape p = new PolygonShape(); p.SetAsBox(0.5f, 1.0f); body.CreateFixture(p); PrismaticJointDef jd = new PrismaticJointDef(); jd.bodyA = body2; jd.bodyB = body; jd.enableLimit = true; jd.localAnchorA.Set(0.0f, 4.0f); jd.localAnchorB.SetZero(); jd.localAxisA.Set(0.0f, 1.0f); jd.lowerTranslation = -1.0f; jd.upperTranslation = 1.0f; m_world.CreateJoint(jd); } // Small box polygon.SetAsBox(1.0f, 0.5f); FixtureDef boxShapeDef = new FixtureDef(); boxShapeDef.shape = polygon; boxShapeDef.Density = 1.0f; boxShapeDef.restitution = 0.1f; boxShapeDef.Filter.GroupIndex = k_smallGroup; boxShapeDef.Filter.CategoryBits = k_boxCategory; boxShapeDef.Filter.MaskBits = k_boxMask; BodyDef boxBodyDef = new BodyDef(); boxBodyDef.type = BodyType._dynamicBody; boxBodyDef.Position.Set(0.0f, 2.0f); Body body3 = m_world.CreateBody(boxBodyDef); body3.CreateFixture(boxShapeDef); // Large box (recycle definitions) polygon.SetAsBox(2.0f, 1.0f); boxShapeDef.Filter.GroupIndex = k_largeGroup; boxBodyDef.Position.Set(0.0f, 6.0f); Body body4 = m_world.CreateBody(boxBodyDef); body4.CreateFixture(boxShapeDef); // Small circle CircleShape circle = new CircleShape(); circle.m_radius = 1.0f; FixtureDef circleShapeDef = new FixtureDef(); circleShapeDef.shape = circle; circleShapeDef.Density = 1.0f; circleShapeDef.Filter.GroupIndex = k_smallGroup; circleShapeDef.Filter.CategoryBits = k_circleCategory; circleShapeDef.Filter.MaskBits = k_circleMask; BodyDef circleBodyDef = new BodyDef(); circleBodyDef.type = BodyType._dynamicBody; circleBodyDef.Position.Set(5.0f, 2.0f); Body body5 = m_world.CreateBody(circleBodyDef); body5.CreateFixture(circleShapeDef); // Large circle circle.m_radius *= 2.0f; circleShapeDef.Filter.GroupIndex = k_largeGroup; circleBodyDef.Position.Set(5.0f, 6.0f); Body body6 = m_world.CreateBody(circleBodyDef); body6.CreateFixture(circleShapeDef); }
public Car() { m_hz = 4.0f; m_zeta = 0.7f; m_speed = 50.0f; Body ground = null; { BodyDef bd = new BodyDef(); ground = m_world.CreateBody(bd); EdgeShape shape = new EdgeShape(); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 0.0f; fd.friction = 0.6f; shape.Set(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f)); ground.CreateFixture(fd); float[] hs = new float[]{0.25f, 1.0f, 4.0f, 0.0f, 0.0f, -1.0f, -2.0f, -2.0f, -1.25f, 0.0f}; float x = 20.0f, y1 = 0.0f, dx = 5.0f; for (int i = 0; i < 10; ++i) { float y2 = hs[i]; shape.Set(new Vec2(x, y1), new Vec2(x + dx, y2)); ground.CreateFixture(fd); y1 = y2; x += dx; } for (int i = 0; i < 10; ++i) { float y2 = hs[i]; shape.Set(new Vec2(x, y1), new Vec2(x + dx, y2)); ground.CreateFixture(fd); y1 = y2; x += dx; } shape.Set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f)); ground.CreateFixture(fd); x += 80.0f; shape.Set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f)); ground.CreateFixture(fd); x += 40.0f; shape.Set(new Vec2(x, 0.0f), new Vec2(x + 10.0f, 5.0f)); ground.CreateFixture(fd); x += 20.0f; shape.Set(new Vec2(x, 0.0f), new Vec2(x + 40.0f, 0.0f)); ground.CreateFixture(fd); x += 40.0f; shape.Set(new Vec2(x, 0.0f), new Vec2(x, 20.0f)); ground.CreateFixture(fd); } // Teeter { BodyDef bd = new BodyDef(); bd.Position.Set(140.0f, 1.0f); bd.type = BodyType._dynamicBody; Body body = m_world.CreateBody(bd); PolygonShape box = new PolygonShape(); box.SetAsBox(10.0f, 0.25f); box.Density = 1; body.CreateFixture(box); RevoluteJointDef jd = new RevoluteJointDef(); jd.Initialize(ground, body, body.GetPosition()); jd.lowerAngle = -8.0f * (float)Math.PI / 180.0f; jd.upperAngle = 8.0f * (float)Math.PI / 180.0f; jd.enableLimit = true; m_world.CreateJoint(jd); body.ApplyAngularImpulse(100.0f, true); } // Bridge { int N = 20; PolygonShape shape = new PolygonShape(); shape.SetAsBox(1.0f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 1.0f; fd.friction = 0.6f; RevoluteJointDef jd = new RevoluteJointDef(); Body prevBody = ground; for (int i = 0; i < N; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(161.0f + 2.0f * i, -0.125f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); Vec2 anchor = new Vec2(160.0f + 2.0f * i, -0.125f); jd.Initialize(prevBody, body, anchor); m_world.CreateJoint(jd); prevBody = body; } Vec2 anchor2 = new Vec2(160.0f + 2.0f * N, -0.125f); jd.Initialize(prevBody, ground, anchor2); m_world.CreateJoint(jd); } // Boxes { PolygonShape box = new PolygonShape(); box.SetAsBox(0.5f, 0.5f); box.Density = 0.5f; Body body = null; BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(230.0f, 0.5f); body = m_world.CreateBody(bd); body.CreateFixture(box); bd.Position.Set(230.0f, 1.5f); body = m_world.CreateBody(bd); body.CreateFixture(box); bd.Position.Set(230.0f, 2.5f); body = m_world.CreateBody(bd); body.CreateFixture(box); bd.Position.Set(230.0f, 3.5f); body = m_world.CreateBody(bd); body.CreateFixture(box); bd.Position.Set(230.0f, 4.5f); body = m_world.CreateBody(bd); body.CreateFixture(box); } // Car { PolygonShape chassis = new PolygonShape(); Vec2[] vertices = new Vec2[8]; vertices[0].Set(-1.5f, -0.5f); vertices[1].Set(1.5f, -0.5f); vertices[2].Set(1.5f, 0.0f); vertices[3].Set(0.0f, 0.9f); vertices[4].Set(-1.15f, 0.9f); vertices[5].Set(-1.5f, 0.2f); chassis.Set(vertices, 6); CircleShape circle = new CircleShape(); circle.m_radius = 0.4f; BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(0.0f, 1.0f); m_car = m_world.CreateBody(bd); m_car.CreateFixture(chassis); FixtureDef fd = new FixtureDef(); fd.shape = circle; fd.Density = 1.0f; fd.friction = 0.9f; bd.Position.Set(-1.0f, 0.35f); m_wheel1 = m_world.CreateBody(bd); m_wheel1.CreateFixture(fd); bd.Position.Set(1.0f, 0.4f); m_wheel2 = m_world.CreateBody(bd); m_wheel2.CreateFixture(fd); WheelJointDef jd = new WheelJointDef(); Vec2 axis = new Vec2(0.0f, 1.0f); jd.Initialize(m_car, m_wheel1, m_wheel1.GetPosition(), axis); jd.motorSpeed = 0.0f; jd.maxMotorTorque = 20.0f; jd.enableMotor = true; jd.frequencyHz = m_hz; jd.dampingRatio = m_zeta; m_spring1 = (WheelJoint)m_world.CreateJoint(jd); jd.Initialize(m_car, m_wheel2, m_wheel2.GetPosition(), axis); jd.motorSpeed = 0.0f; jd.maxMotorTorque = 10.0f; jd.enableMotor = false; jd.frequencyHz = m_hz; jd.dampingRatio = m_zeta; m_spring2 = (WheelJoint)m_world.CreateJoint(jd); } }
public CompoundShapes() { { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 0.0f); Body body = m_world.CreateBody(bd); EdgeShape shape = new EdgeShape(); shape.Set(new Vec2(50.0f, 0.0f), new Vec2(-50.0f, 0.0f)); shape.Density = 0; body.CreateFixture(shape); } { CircleShape circle1 = new CircleShape(); circle1.m_radius = 0.5f; circle1.m_p.Set(-0.5f, 0.5f); circle1.Density = 2; CircleShape circle2 = new CircleShape(); circle2.m_radius = 0.5f; circle2.m_p.Set(0.5f, 0.5f); circle2.Density = 0; for (int i = 0; i < 10; ++i) { float x = RandomFloat(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(x + 5.0f, 1.05f + 2.5f * i); bd.angle = RandomFloat(-(float)Math.PI, (float)Math.PI); Body body = m_world.CreateBody(bd); body.CreateFixture(circle1); body.CreateFixture(circle2); } } { PolygonShape polygon1 = new PolygonShape(); polygon1.SetAsBox(0.25f, 0.5f); polygon1.Density = 2; PolygonShape polygon2 = new PolygonShape(); polygon2.SetAsBox(0.25f, 0.5f, new Vec2(0.0f, -0.5f), 0.5f * (float)Math.PI); polygon2.Density = 2; for (int i = 0; i < 10; ++i) { float x = RandomFloat(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(x - 5.0f, 1.05f + 2.5f * i); bd.angle = RandomFloat(-(float)Math.PI, (float)Math.PI); Body body = m_world.CreateBody(bd); body.CreateFixture(polygon1); body.CreateFixture(polygon2); } } { Transform xf1 = new Transform(); xf1.q.Set(0.3524f * (float)Math.PI); xf1.p = xf1.q.GetXAxis(); Vec2[] vertices = new Vec2[3]; PolygonShape triangle1 = new PolygonShape(); vertices[0] = Utilities.Mul(xf1, new Vec2(-1.0f, 0.0f)); vertices[1] = Utilities.Mul(xf1, new Vec2(1.0f, 0.0f)); vertices[2] = Utilities.Mul(xf1, new Vec2(0.0f, 0.5f)); triangle1.Set(vertices, 3); Transform xf2 = new Transform(); xf2.q.Set(-0.3524f * (float)Math.PI); xf2.p = -xf2.q.GetXAxis(); PolygonShape triangle2 = new PolygonShape(); vertices[0] = Utilities.Mul(xf2, new Vec2(-1.0f, 0.0f)); vertices[1] = Utilities.Mul(xf2, new Vec2(1.0f, 0.0f)); vertices[2] = Utilities.Mul(xf2, new Vec2(0.0f, 0.5f)); triangle2.Set(vertices, 3); for (int i = 0; i < 10; ++i) { float x = RandomFloat(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(x, 2.05f + 2.5f * i); bd.angle = 0.0f; Body body = m_world.CreateBody(bd); triangle1.Density = 2; triangle2.Density = 2; body.CreateFixture(triangle1); body.CreateFixture(triangle2); } } { PolygonShape bottom = new PolygonShape(); bottom.SetAsBox( 1.5f, 0.15f ); PolygonShape left = new PolygonShape(); left.SetAsBox(0.15f, 2.7f, new Vec2(-1.45f, 2.35f), 0.2f); PolygonShape right = new PolygonShape(); right.SetAsBox(0.15f, 2.7f, new Vec2(1.45f, 2.35f), -0.2f); BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set( 0.0f, 2.0f ); Body body = m_world.CreateBody(bd); bottom.Density = 4; left.Density = 4; right.Density = 4; body.CreateFixture(bottom); body.CreateFixture(left); body.CreateFixture(right); } }
DumpShell() { Vec2 g = new Vec2(0, 0); m_world.SetGravity(g); List<Body> bodies = new List<Body>(); List<Joint> joints = new List<Joint>(); { BodyDef bd = new BodyDef(); bd.type = (BodyType)2; bd.Position.Set(3.000000000000000e+001f, 6.909857940673828e+001f); bd.angle = 0.000000000000000e+000f; bd.linearVelocity.Set(0.000000000000000e+000f, -8.618643951416016e+001f); bd.angularVelocity = 0.000000000000000e+000f; bd.linearDamping = 0.000000000000000e+000f; bd.angularDamping = 0.000000000000000e+000f; bd.allowSleep = true; bd.awake = true; bd.fixedRotation = true; bd.bullet = false; bd.active = true; bd.gravityScale = 1.000000000000000e+000f; bodies.Add(m_world.CreateBody(bd)); { FixtureDef fd = new FixtureDef(); fd.friction = 6.000000238418579e-001f; fd.restitution = 0.000000000000000e+000f; fd.Density = 5.000000000000000e-001f; fd.IsSensor = false; fd.Filter.CategoryBits = (ushort)(1); fd.Filter.MaskBits = (ushort)(2); fd.Filter.GroupIndex = (short)(0); PolygonShape shape = new PolygonShape(); Vec2[] vs = new Vec2[8]; vs[0].Set(-1.950000047683716e+000f, -4.750000000000000e+000f); vs[1].Set(1.950000047683716e+000f, -4.750000000000000e+000f); vs[2].Set(1.950000047683716e+000f, 4.750000000000000e+000f); vs[3].Set(-1.950000047683716e+000f, 4.750000000000000e+000f); shape.Set(vs, 4); fd.shape = shape; bodies[0].CreateFixture(fd); } } { BodyDef bd = new BodyDef(); bd.type = (BodyType)(0); bd.Position.Set(5.120000457763672e+001f, 7.580000305175781e+001f); bd.angle = 0.000000000000000e+000f; bd.linearVelocity.Set(0.000000000000000e+000f, 0.000000000000000e+000f); bd.angularVelocity = 0.000000000000000e+000f; bd.linearDamping = 0.000000000000000e+000f; bd.angularDamping = 0.000000000000000e+000f; bd.allowSleep = true; bd.awake = true; bd.fixedRotation = false; bd.bullet = false; bd.active = true; bd.gravityScale = 1.000000000000000e+000f; bodies.Add(m_world.CreateBody(bd)); { FixtureDef fd = new FixtureDef(); fd.friction = 0.000000000000000e+000f; fd.restitution = 0.000000000000000e+000f; fd.Density = 1.000000000000000e+000f; fd.IsSensor = false; fd.Filter.CategoryBits = (ushort)(2); fd.Filter.MaskBits = (ushort)(65535); fd.Filter.GroupIndex = (short)(0); PolygonShape shape = new PolygonShape(); Vec2[] vs = new Vec2[8]; vs[0].Set(-5.120000076293945e+001f, -5.000000000000000e-001f); vs[1].Set(5.120000076293945e+001f, -5.000000000000000e-001f); vs[2].Set(5.120000076293945e+001f, 5.000000000000000e-001f); vs[3].Set(-5.120000076293945e+001f, 5.000000000000000e-001f); shape.Set(vs, 4); fd.shape = shape; bodies[1].CreateFixture(fd); } } joints = null; bodies = null; }
public CollisionProcessing() { // Ground body { EdgeShape shape = new EdgeShape(); shape.Set(new Vec2(-50.0f, 0.0f), new Vec2(50.0f, 0.0f)); FixtureDef sd = new FixtureDef(); sd.shape = shape;; BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); ground.CreateFixture(sd); } float xLo = -5.0f, xHi = 5.0f; float yLo = 2.0f, yHi = 35.0f; // Small triangle Vec2[] vertices = new Vec2[3]; vertices[0].Set(-1.0f, 0.0f); vertices[1].Set(1.0f, 0.0f); vertices[2].Set(0.0f, 2.0f); PolygonShape polygon = new PolygonShape(); polygon.Set(vertices, 3); FixtureDef triangleShapeDef = new FixtureDef(); triangleShapeDef.shape = polygon; triangleShapeDef.Density = 1.0f; BodyDef triangleBodyDef = new BodyDef(); triangleBodyDef.type = BodyType._dynamicBody; triangleBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); Body body1 = m_world.CreateBody(triangleBodyDef); body1.CreateFixture(triangleShapeDef); // Large triangle (recycle definitions) vertices[0] *= 2.0f; vertices[1] *= 2.0f; vertices[2] *= 2.0f; polygon.Set(vertices, 3); triangleBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); Body body2 = m_world.CreateBody(triangleBodyDef); body2.CreateFixture(triangleShapeDef); // Small box polygon.SetAsBox(1.0f, 0.5f); FixtureDef boxShapeDef = new FixtureDef(); boxShapeDef.shape = polygon; boxShapeDef.Density = 1.0f; BodyDef boxBodyDef = new BodyDef(); boxBodyDef.type = BodyType._dynamicBody; boxBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); Body body3 = m_world.CreateBody(boxBodyDef); body3.CreateFixture(boxShapeDef); // Large box (recycle definitions) polygon.SetAsBox(2.0f, 1.0f); boxBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); Body body4 = m_world.CreateBody(boxBodyDef); body4.CreateFixture(boxShapeDef); // Small circle CircleShape circle = new CircleShape(); circle.m_radius = 1.0f; FixtureDef circleShapeDef = new FixtureDef(); circleShapeDef.shape = circle; circleShapeDef.Density = 1.0f; BodyDef circleBodyDef = new BodyDef(); circleBodyDef.type = BodyType._dynamicBody; circleBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); Body body5 = m_world.CreateBody(circleBodyDef); body5.CreateFixture(circleShapeDef); // Large circle circle.m_radius *= 2.0f; circleBodyDef.Position.Set(RandomFloat(xLo, xHi), RandomFloat(yLo, yHi)); Body body6 = m_world.CreateBody(circleBodyDef); body6.CreateFixture(circleShapeDef); }
public void CreateLeg(float s, Vec2 wheelAnchor) { Vec2 p1 = new Vec2(5.4f * s, -6.1f); Vec2 p2 = new Vec2(7.2f * s, -1.2f); Vec2 p3 = new Vec2(4.3f * s, -1.9f); Vec2 p4 = new Vec2(3.1f * s, 0.8f); Vec2 p5 = new Vec2(6.0f * s, 1.5f); Vec2 p6 = new Vec2(2.5f * s, 3.7f); FixtureDef fd1 = new FixtureDef(); FixtureDef fd2 = new FixtureDef(); fd1.Filter.GroupIndex = -1; fd2.Filter.GroupIndex = -1; fd1.Density = 1.0f; fd2.Density = 1.0f; PolygonShape poly1 = new PolygonShape(); PolygonShape poly2 = new PolygonShape(); if (s > 0.0f) { Vec2[] vertices = new Vec2[3]; vertices[0] = p1; vertices[1] = p2; vertices[2] = p3; poly1.Set(vertices, 3); vertices[0] = new Vec2(0, 0); vertices[1] = p5 - p4; vertices[2] = p6 - p4; poly2.Set(vertices, 3); } else { Vec2[] vertices = new Vec2[3]; vertices[0] = p1; vertices[1] = p3; vertices[2] = p2; poly1.Set(vertices, 3); vertices[0] = new Vec2(0, 0); vertices[1] = p6 - p4; vertices[2] = p5 - p4; poly2.Set(vertices, 3); } fd1.shape = poly1; fd2.shape = poly2; BodyDef bd1 = new BodyDef(); BodyDef bd2 = new BodyDef(); bd1.type = BodyType._dynamicBody; bd2.type = BodyType._dynamicBody; bd1.Position = m_offset; bd2.Position = p4 + m_offset; bd1.angularDamping = 10.0f; bd2.angularDamping = 10.0f; Body body1 = m_world.CreateBody(bd1); Body body2 = m_world.CreateBody(bd2); body1.CreateFixture(fd1); body2.CreateFixture(fd2); DistanceJointDef djd = new DistanceJointDef(); // Using a soft distance constraint can reduce some jitter. // It also makes the structure seem a bit more fluid by // acting like a suspension system. djd.dampingRatio = 0.5f; djd.frequencyHz = 10.0f; djd.Initialize(body1, body2, p2 + 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); RevoluteJointDef rjd = new RevoluteJointDef(); rjd.Initialize(body2, m_chassis, p4 + m_offset); m_world.CreateJoint(rjd); }
Cantilever() { Body ground = null; { BodyDef bd = new BodyDef(); ground = m_world.CreateBody(bd); EdgeShape shape = new EdgeShape(); shape.Set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); shape.Density = 0; ground.CreateFixture(shape); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 20.0f; WeldJointDef jd = new WeldJointDef(); Body prevBody = ground; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(-14.5f + 1.0f * i, 5.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); Vec2 anchor = new Vec2(-15.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); m_world.CreateJoint(jd); prevBody = body; } } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(1.0f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 20.0f; WeldJointDef jd = new WeldJointDef(); jd.frequencyHz = 5.0f; jd.dampingRatio = 0.7f; Body prevBody = ground; for (int i = 0; i < 3; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(-14.0f + 2.0f * i, 15.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); Vec2 anchor = new Vec2(-15.0f + 2.0f * i, 15.0f); jd.Initialize(prevBody, body, anchor); m_world.CreateJoint(jd); prevBody = body; } } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 20.0f; WeldJointDef jd = new WeldJointDef(); Body prevBody = ground; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(-4.5f + 1.0f * i, 5.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); if (i > 0) { Vec2 anchor = new Vec2(-5.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); m_world.CreateJoint(jd); } prevBody = body; } } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 20.0f; WeldJointDef jd = new WeldJointDef(); jd.frequencyHz = 8.0f; jd.dampingRatio = 0.7f; Body prevBody = ground; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(5.5f + 1.0f * i, 10.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); if (i > 0) { Vec2 anchor = new Vec2(5.0f + 1.0f * i, 10.0f); jd.Initialize(prevBody, body, anchor); m_world.CreateJoint(jd); } prevBody = body; } } for (int i = 0; i < 2; ++i) { Vec2[] vertices = new Vec2[3]; vertices[0].Set(-0.5f, 0.0f); vertices[1].Set(0.5f, 0.0f); vertices[2].Set(0.0f, 1.5f); PolygonShape shape = new PolygonShape(); shape.Set(vertices, 3); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 1.0f; BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(-8.0f + 8.0f * i, 12.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); } for (int i = 0; i < 2; ++i) { CircleShape shape = new CircleShape(); shape.m_radius = 0.5f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 1.0f; BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(-6.0f + 6.0f * i, 10.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); } }