public b2WheelJoint(b2WheelJointDef def) : base(def) { m_localAnchorA = def.localAnchorA; m_localAnchorB = def.localAnchorB; m_localXAxisA = def.localAxisA; m_localYAxisA = m_localXAxisA.NegUnitCross(); // m_localYAxisA = b2Math.b2Cross(1.0f, m_localXAxisA); m_mass = 0.0f; m_impulse = 0.0f; m_motorMass = 0.0f; m_motorImpulse = 0.0f; m_springMass = 0.0f; m_springImpulse = 0.0f; m_maxMotorTorque = def.maxMotorTorque; m_motorSpeed = def.motorSpeed; m_enableMotor = def.enableMotor; m_frequencyHz = def.frequencyHz; m_dampingRatio = def.dampingRatio; m_bias = 0.0f; m_gamma = 0.0f; m_ax.SetZero(); m_ay.SetZero(); }
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); } }