def __init__(self): super(ElasticBody, self).__init__() bodies = self.bodies for i in range(64): bodies.append(None) # Bottom static body sd = box2d.b2PolygonDef() sd.SetAsBox(50.0, 2.0) sd.friction = 0.1 sd.restitution = 0.1 bd = box2d.b2BodyDef() bd.position.Set(-1.0, -7.5) self.m_ground = self.world.CreateBody(bd) self.m_ground.CreateShape(sd) # Upper static body sd = box2d.b2PolygonDef() sd.SetAsBox(20.0, 0.50, box2d.b2Vec2(0, 0), 0.047 * box2d.b2_pi) sd.friction = 0.01 sd.restitution = 0.001 bd = box2d.b2BodyDef() bd.position.Set(-20, 93.0) g = self.world.CreateBody(bd) g.CreateShape(sd) sd.SetAsBox(15, 0.50, box2d.b2Vec2(-15.0, 12.5), 0.0) g.CreateShape(sd) sd.SetAsBox(20, 0.5, box2d.b2Vec2(0.0, -25.0), -0.5) g.CreateShape(sd) # Left channel left wall sd = box2d.b2PolygonDef() sd.SetAsBox(0.7, 55.0) sd.friction = 0.1 sd.restitution = 0.1 bd = box2d.b2BodyDef() bd.position.Set(-49.3, 50.0) g = self.world.CreateBody(bd) g.CreateShape(sd) # Right wall sd = box2d.b2PolygonDef() sd.SetAsBox(0.7, 55.0) sd.friction = 0.1 sd.restitution = 0.1 bd = box2d.b2BodyDef() bd.position.Set(45, 50.0) g = self.world.CreateBody(bd) g.CreateShape(sd) # Left channel right upper wall sd = box2d.b2PolygonDef() sd.SetAsBox(0.5, 20.0) sd.friction = 0.05 sd.restitution = 0.01 bd = box2d.b2BodyDef() bd.position.Set(-42.0, 70.0) bd.angle = -0.03 * box2d.b2_pi g = self.world.CreateBody(bd) g.CreateShape(sd) # Left channel right lower wall sd = box2d.b2PolygonDef() sd.SetAsBox(0.50, 23.0) sd.friction = 0.05 sd.restitution = 0.01 bd = box2d.b2BodyDef() bd.position.Set(-44.0, 27.0) g = self.world.CreateBody(bd) g.CreateShape(sd) # Bottom motors cd = box2d.b2CircleDef() cd.radius = 3.0 cd.density = 15.0 cd.friction = 1 cd.restitution = 0.2 # 1. bd.position.Set(-40.0, 2.5) body = self.world.CreateBody(bd) body.CreateShape(cd) body.SetMassFromShapes() jr = box2d.b2RevoluteJointDef() jr.Initialize(g, body, body.GetWorldCenter() + box2d.b2Vec2(0, 1)) jr.maxMotorTorque = 30000 jr.enableMotor = True jr.motorSpeed = 20 self.world.CreateJoint(jr).getAsType() # 1. left down bd.position.Set(-46.0, -2.5) cd.radius = 1.5 jr.motorSpeed = -20 body = self.world.CreateBody(bd) body.CreateShape(cd) sd.SetAsBox(2.0, 0.50) body.CreateShape(sd) body.SetMassFromShapes() jr.Initialize(g, body, body.GetWorldCenter()) self.world.CreateJoint(jr).getAsType() # 2. cd.radius = 3.0 jr.motorSpeed = 20 bd.position.Set(-32.0, 2.5) body = self.world.CreateBody(bd) body.CreateShape(cd) body.SetMassFromShapes() jr.Initialize(g, body, body.GetWorldCenter() + box2d.b2Vec2(0, 1)) self.world.CreateJoint(jr).getAsType() # 3. jr.motorSpeed = 20 bd.position.Set(-24.0, 1.5) body = self.world.CreateBody(bd) body.CreateShape(cd) body.SetMassFromShapes() jr.Initialize(g, body, body.GetWorldCenter() + box2d.b2Vec2(0, 1)) self.world.CreateJoint(jr).getAsType() # 4. bd.position.Set(-16.0, 0.8) body = self.world.CreateBody(bd) body.CreateShape(cd) body.SetMassFromShapes() jr.Initialize(g, body, body.GetWorldCenter() + box2d.b2Vec2(0, 1)) self.world.CreateJoint(jr).getAsType() # 5. bd.position.Set(-8.0, 0.5) body = self.world.CreateBody(bd) body.CreateShape(cd) body.SetMassFromShapes() jr.Initialize(g, body, body.GetWorldCenter() + box2d.b2Vec2(0, 1)) self.world.CreateJoint(jr).getAsType() # 6. bd.position.Set(0.0, 0.1) body = self.world.CreateBody(bd) body.CreateShape(cd) body.SetMassFromShapes() jr.Initialize(g, body, body.GetWorldCenter() + box2d.b2Vec2(0, 1)) self.world.CreateJoint(jr).getAsType() # 7. bd.position.Set(8.0, -0.5) body = self.world.CreateBody(bd) body.CreateShape(cd) sd.SetAsBox(3.7, 0.5) body.CreateShape(sd) body.SetMassFromShapes() jr.Initialize(g, body, body.GetWorldCenter() + box2d.b2Vec2(0, 1)) self.world.CreateJoint(jr).getAsType() # 8. right rotator sd.SetAsBox(5, 0.5) sd.density = 2.0 bd.position.Set(18.0, 1) rightmotor = self.world.CreateBody(bd) # rightmotor.CreateShape(sd) sd.SetAsBox(4.5, 0.5, box2d.b2Vec2(0, 0), box2d.b2_pi / 3) rightmotor.CreateShape(sd) sd.SetAsBox(4.5, 0.5, box2d.b2Vec2(0, 0), box2d.b2_pi * 2 / 3) rightmotor.CreateShape(sd) cd.radius = 4.2 rightmotor.CreateShape(cd) rightmotor.SetMassFromShapes() jr.Initialize(g, rightmotor, rightmotor.GetWorldCenter()) jr.maxMotorTorque = 70000 jr.motorSpeed = -4 self.world.CreateJoint(jr).getAsType() # 9. left rotator sd.SetAsBox(8.5, 0.5) sd.density = 2.0 bd.position.Set(-34.0, 17) body = self.world.CreateBody(bd) body.CreateShape(sd) sd.SetAsBox(8.5, 0.5, box2d.b2Vec2(0, 0), box2d.b2_pi * 0.5) body.CreateShape(sd) cd.radius = 7 cd.friction = 0.9 body.CreateShape(cd) body.SetMassFromShapes() jr.Initialize(g, body, body.GetWorldCenter()) jr.maxMotorTorque = 100000 jr.motorSpeed = -5 self.world.CreateJoint(jr).getAsType() # big compressor sd.SetAsBox(3.0, 4) sd.density = 10.0 bd.position.Set(-16.0, 17) hammerleft = self.world.CreateBody(bd) hammerleft.CreateShape(sd) hammerleft.SetMassFromShapes() jd = box2d.b2DistanceJointDef() jd.Initialize(body, hammerleft, body.GetWorldCenter() + box2d.b2Vec2(0, 6), hammerleft.GetWorldCenter()) self.world.CreateJoint(jd).getAsType() bd.position.Set(4.0, 17) hammerright = self.world.CreateBody(bd) hammerright.CreateShape(sd) hammerright.SetMassFromShapes() jd.Initialize(body, hammerright, body.GetWorldCenter() - box2d.b2Vec2(0, 6), hammerright.GetWorldCenter()) self.world.CreateJoint(jd).getAsType() # pusher sd.SetAsBox(6, 0.75) bd.position.Set(-21.0, 9) pusher = self.world.CreateBody(bd) # pusher.CreateShape(sd) sd.SetAsBox(2, 1.5, box2d.b2Vec2(-5, 0), 0) pusher.SetMassFromShapes() pusher.CreateShape(sd) jd.Initialize( rightmotor, pusher, rightmotor.GetWorldCenter() + box2d.b2Vec2(-8.0, 0), pusher.GetWorldCenter() + box2d.b2Vec2(5.0, 0), ) self.world.CreateJoint(jd).getAsType() # Static bodies above motors sd = box2d.b2PolygonDef() cd = box2d.b2CircleDef() sd.SetAsBox(9.0, 0.5) sd.friction = 0.05 sd.restitution = 0.01 bd = box2d.b2BodyDef() bd.position.Set(-15.5, 12) bd.angle = 0.0 g = self.world.CreateBody(bd) g.CreateShape(sd) sd.SetAsBox(8, 0.5, box2d.b2Vec2(23, 0), 0) g.CreateShape(sd) # compressor statics sd.SetAsBox(7.0, 0.5, box2d.b2Vec2(-2, 9), 0) g.CreateShape(sd) sd.SetAsBox(9.0, 0.5, box2d.b2Vec2(22, 9), 0) g.CreateShape(sd) sd.SetAsBox(19.0, 0.5, box2d.b2Vec2(-9, 15), -0.05) g.CreateShape(sd) sd.SetAsBox(4.7, 0.5, box2d.b2Vec2(15, 11.5), -0.5) g.CreateShape(sd) # below compressor sd.SetAsBox(26.0, 0.3, box2d.b2Vec2(17, -4.4), -0.02) g.CreateShape(sd) cd.radius = 1.0 cd.friction = 1.0 cd.localPosition = box2d.b2Vec2(29, -6) g.CreateShape(cd) cd.radius = 0.7 cd.localPosition = box2d.b2Vec2(-2, -4.5) g.CreateShape(cd) # Elevator bd = box2d.b2BodyDef() cd = box2d.b2CircleDef() sd = box2d.b2PolygonDef() bd.position.Set(40.0, 4.0) self.m_elev = self.world.CreateBody(bd) sd.SetAsBox(0.5, 2.5, box2d.b2Vec2(3.0, -3.0), 0) sd.density = 1 sd.friction = 0.01 self.m_elev.CreateShape(sd) sd.SetAsBox(7.0, 0.5, box2d.b2Vec2(-3.5, -5.5), 0) self.m_elev.CreateShape(sd) sd.SetAsBox(0.5, 2.5, box2d.b2Vec2(-11, -3.5), 0) self.m_elev.CreateShape(sd) self.m_elev.SetMassFromShapes() jp = box2d.b2PrismaticJointDef() jp.Initialize(self.m_ground, self.m_elev, bd.position, box2d.b2Vec2(0.0, 1.0)) jp.lowerTranslation = 0.0 jp.upperTranslation = 100.0 jp.enableLimit = True jp.enableMotor = True jp.maxMotorForce = 10000 jp.motorSpeed = 0 self.m_joint_elev = self.world.CreateJoint(jp).getAsType() # Korb sd.SetAsBox(2.3, 0.5, box2d.b2Vec2(1, 0.0), 0.0) sd.density = 0.5 bd.position.Set(29.0, 6.5) body = self.world.CreateBody(bd) # body.CreateShape(sd) sd.SetAsBox(2.5, 0.5, box2d.b2Vec2(3.0, -2), box2d.b2_pi / 2) body.CreateShape(sd) sd.SetAsBox(4.6, 0.5, box2d.b2Vec2(7.8, -4.0), 0) body.CreateShape(sd) sd.SetAsBox(0.5, 4.5, box2d.b2Vec2(12, 0.0), 0) body.CreateShape(sd) sd.SetAsBox(0.5, 0.5, box2d.b2Vec2(13, 4.0), 0) body.CreateShape(sd) cd.radius = 0.7 cd.density = 1 cd.friction = 0.01 cd.localPosition = box2d.b2Vec2(0, 0) body.CreateShape(cd) body.SetMassFromShapes() jr = box2d.b2RevoluteJointDef() jr.Initialize(self.m_elev, body, bd.position) jr.enableLimit = True jr.lowerAngle = -0.2 jr.upperAngle = box2d.b2_pi * 1.1 jr.collideConnected = True self.world.CreateJoint(jr).getAsType() # upper body exit sd.SetAsBox(14.0, 0.5, box2d.b2Vec2(-3.5, -10.0), 0.0) bd.position.Set(17.5, 96.0) body = self.world.CreateBody(bd) body.CreateShape(sd) # "Elastic body" 64 bodies - something like a lin. elastic compound # connected via dynamic forces (springs) sd = box2d.b2PolygonDef() sd.SetAsBox(0.55, 0.55) sd.density = 1.5 sd.friction = 0.01 sd.filter.groupIndex = -1 startpoint = box2d.b2Vec2(30, 20) bd = box2d.b2BodyDef() bd.isBullet = False bd.allowSleep = False for i in range(8): for j in range(8): bd.position.Set(j * 1.02, 2.51 + 1.02 * i) bd.position += startpoint body = self.world.CreateBody(bd) # bodies[8 * i + j] = body body.CreateShape(sd) body.SetMassFromShapes()
def __init__(self): super(MotorsAndLimits, self).__init__() sd=box2d.b2PolygonDef() sd.SetAsBox(50.0, 10.0) bd=box2d.b2BodyDef() bd.position.Set(0.0, -10.0) ground = self.world.CreateBody(bd) ground.CreateShape(sd) sd=box2d.b2PolygonDef() sd.SetAsBox(2.0, 0.5) sd.density = 5.0 sd.friction = 0.05 bd=box2d.b2BodyDef() rjd=box2d.b2RevoluteJointDef() prevBody=ground y = 8.0 bd.position.Set(3.0, y) body = self.world.CreateBody(bd) body.CreateShape(sd) body.SetMassFromShapes() rjd.Initialize(prevBody, body, box2d.b2Vec2(0.0, y)) rjd.motorSpeed = 1.0 * box2d.b2_pi rjd.maxMotorTorque = 10000.0 rjd.enableMotor = True self.m_joint1 = self.world.CreateJoint(rjd).getAsType() prevBody = body bd.position.Set(9.0, y) body = self.world.CreateBody(bd) body.CreateShape(sd) body.SetMassFromShapes() rjd.Initialize(prevBody, body, box2d.b2Vec2(6.0, y)) rjd.motorSpeed = 0.5 * box2d.b2_pi rjd.maxMotorTorque = 2000.0 rjd.enableMotor = True rjd.lowerAngle = - 0.5 * box2d.b2_pi rjd.upperAngle = 0.5 * box2d.b2_pi rjd.enableLimit = True self.m_joint2 = self.world.CreateJoint(rjd).getAsType() bd.position.Set(-10.0, 10.0) bd.angle = 0.5 * box2d.b2_pi body = self.world.CreateBody(bd) body.CreateShape(sd) body.SetMassFromShapes() pjd=box2d.b2PrismaticJointDef() pjd.Initialize(ground, body, box2d.b2Vec2(-10.0, 10.0), box2d.b2Vec2(1.0, 0.0)) pjd.motorSpeed = 10.0 pjd.maxMotorForce = 1000.0 pjd.enableMotor = True pjd.lowerTranslation = 0.0 pjd.upperTranslation = 20.0 pjd.enableLimit = True self.m_joint3 = self.world.CreateJoint(pjd).getAsType()
def __init__(self): super(SliderCrank, self).__init__() sd=box2d.b2PolygonDef() sd.SetAsBox(50.0, 10.0) bd=box2d.b2BodyDef() bd.position.Set(0.0, -10.0) ground = self.world.CreateBody(bd) ground.CreateShape(sd) # Define crank. sd=box2d.b2PolygonDef() sd.SetAsBox(0.5, 2.0) sd.density = 1.0 rjd=box2d.b2RevoluteJointDef() prevBody=ground bd=box2d.b2BodyDef() bd.position.Set(0.0, 7.0) body = self.world.CreateBody(bd) body.CreateShape(sd) body.SetMassFromShapes() rjd.Initialize(prevBody, body, box2d.b2Vec2(0.0, 5.0)) rjd.motorSpeed = 1.0 * box2d.b2_pi rjd.maxMotorTorque = 10000.0 rjd.enableMotor = True self.m_joint1 = self.world.CreateJoint(rjd).getAsType() prevBody = body # Define follower. sd.SetAsBox(0.5, 4.0) bd.position.Set(0.0, 13.0) body = self.world.CreateBody(bd) body.CreateShape(sd) body.SetMassFromShapes() rjd.Initialize(prevBody, body, box2d.b2Vec2(0.0, 9.0)) rjd.enableMotor = False self.world.CreateJoint(rjd).getAsType() prevBody = body # Define piston sd.SetAsBox(1.5, 1.5) bd.position.Set(0.0, 17.0) body = self.world.CreateBody(bd) body.CreateShape(sd) body.SetMassFromShapes() rjd.Initialize(prevBody, body, box2d.b2Vec2(0.0, 17.0)) self.world.CreateJoint(rjd).getAsType() pjd=box2d.b2PrismaticJointDef() pjd.Initialize(ground, body, box2d.b2Vec2(0.0, 17.0), box2d.b2Vec2(0.0, 1.0)) pjd.maxMotorForce = 1000.0 pjd.enableMotor = True self.m_joint2 = self.world.CreateJoint(pjd).getAsType() # Create a payload sd.density = 2.0 bd.position.Set(0.0, 23.0) body = self.world.CreateBody(bd) body.CreateShape(sd) body.SetMassFromShapes()
def __init__(self): super(Gears, self).__init__() bd=box2d.b2BodyDef() bd.position.Set(0.0, -10.0) ground = self.world.CreateBody(bd) sd=box2d.b2PolygonDef() sd.SetAsBox(50.0, 10.0) ground.CreateShape(sd) circle1=box2d.b2CircleDef() circle1.radius = 1.0 circle1.density = 5.0 circle2=box2d.b2CircleDef() circle2.radius = 2.0 circle2.density = 5.0 box=box2d.b2PolygonDef() box.SetAsBox(0.5, 5.0) box.density = 5.0 bd1=box2d.b2BodyDef() bd1.position.Set(-3.0, 12.0) body1 = self.world.CreateBody(bd1) body1.CreateShape(circle1) body1.SetMassFromShapes() jd1=box2d.b2RevoluteJointDef() jd1.body1 = ground jd1.body2 = body1 jd1.localAnchor1 = ground.GetLocalPoint(bd1.position) jd1.localAnchor2 = body1.GetLocalPoint(bd1.position) jd1.referenceAngle = body1.GetAngle() - ground.GetAngle() self.m_joint1 = self.world.CreateJoint(jd1).getAsType() bd2=box2d.b2BodyDef() bd2.position.Set(0.0, 12.0) body2 = self.world.CreateBody(bd2) body2.CreateShape(circle2) body2.SetMassFromShapes() jd2=box2d.b2RevoluteJointDef() jd2.Initialize(ground, body2, bd2.position) self.m_joint2 = self.world.CreateJoint(jd2).getAsType() bd3=box2d.b2BodyDef() bd3.position.Set(2.5, 12.0) body3 = self.world.CreateBody(bd3) body3.CreateShape(box) body3.SetMassFromShapes() jd3=box2d.b2PrismaticJointDef() jd3.Initialize(ground, body3, bd3.position, box2d.b2Vec2(0.0, 1.0)) jd3.lowerTranslation = -5.0 jd3.upperTranslation = 5.0 jd3.enableLimit = True self.m_joint3 = self.world.CreateJoint(jd3).getAsType() jd4=box2d.b2GearJointDef() jd4.body1 = body1 jd4.body2 = body2 jd4.joint1 = self.m_joint1 jd4.joint2 = self.m_joint2 jd4.ratio = circle2.radius / circle1.radius self.m_joint4 = self.world.CreateJoint(jd4).getAsType() jd5=box2d.b2GearJointDef() jd5.body1 = body2 jd5.body2 = body3 jd5.joint1 = self.m_joint2 jd5.joint2 = self.m_joint3 jd5.ratio = -1.0 / circle2.radius self.m_joint5 = self.world.CreateJoint(jd5).getAsType()