|
HULL_POLYGONS = [ |
|
[[-30, +9], [+6, +9], [+34, +1], [+34, -8], [-30, -8]] |
|
]; |
|
HULL_BOTTOM_WIDTH = 64; |
|
const SPEED_HIP = 4; |
|
const SPEED_KNEE = 6; |
|
|
|
|
|
|
|
|
|
class ClassicBipedalBody extends WalkerAbstractBody { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
constructor(scale, motors_torque=80, nb_steps_under_water=600, reset_on_hull_critical_contact=false) { |
|
super(scale, motors_torque, nb_steps_under_water); |
|
|
|
this.LEG_DOWN = 3 / this.SCALE; |
|
this.LEG_W = 8 / this.SCALE; |
|
this.LEG_H = 34 / this.SCALE; |
|
this.TORQUE_PENALTY = 0.00035; |
|
this.reset_on_hull_critical_contact = reset_on_hull_critical_contact; |
|
|
|
this.AGENT_WIDTH = HULL_BOTTOM_WIDTH / this.SCALE; |
|
this.AGENT_HEIGHT = 17 / this.SCALE + this.LEG_H * 2 - this.LEG_DOWN; |
|
this.AGENT_CENTER_HEIGHT = this.LEG_H * 2 + this.LEG_DOWN; |
|
|
|
this.old_morphology = false; |
|
} |
|
|
|
draw(world, init_x, init_y, force_to_center){ |
|
let HULL_FIXTURES = []; |
|
let fd_polygon; |
|
let vertices; |
|
let y_offset = 0; |
|
|
|
for(let polygon of HULL_POLYGONS){ |
|
fd_polygon = new b2.FixtureDef(); |
|
fd_polygon.shape = new b2.PolygonShape(); |
|
vertices = []; |
|
for(let vertex of polygon){ |
|
vertices.push(new b2.Vec2(vertex[0] / this.SCALE, vertex[1] / this.SCALE)); |
|
} |
|
fd_polygon.shape.Set(vertices, polygon.length); |
|
fd_polygon.density = 5.0; |
|
fd_polygon.friction = 0.1; |
|
fd_polygon.filter.categoryBits = 0x20; |
|
fd_polygon.filter.maskBits = 0x000F; |
|
HULL_FIXTURES.push(fd_polygon); |
|
} |
|
|
|
let LEG_FD = new b2.FixtureDef(); |
|
LEG_FD.shape = new b2.PolygonShape(); |
|
LEG_FD.shape.SetAsBox(this.LEG_W / 2, this.LEG_H / 2); |
|
LEG_FD.density = 1.0; |
|
LEG_FD.restitution = 0.0; |
|
LEG_FD.filter.categoryBits = 0x20; |
|
LEG_FD.filter.maskBits = 0x000F; |
|
|
|
let LOWER_FD = new b2.FixtureDef(); |
|
LOWER_FD.shape = new b2.PolygonShape(); |
|
LOWER_FD.shape.SetAsBox(0.8 * this.LEG_W / 2, this.LEG_H / 2); |
|
LOWER_FD.density = 1.0; |
|
LOWER_FD.restitution = 0.0; |
|
LOWER_FD.filter.categoryBits = 0x20; |
|
LOWER_FD.filter.maskBits = 0x000F; |
|
|
|
let hull_bd = new b2.BodyDef(); |
|
hull_bd.type = b2.Body.b2_dynamicBody; |
|
hull_bd.position.Set(init_x, init_y + y_offset); |
|
let hull = world.CreateBody(hull_bd); |
|
for(let fd of HULL_FIXTURES){ |
|
hull.CreateFixture(fd); |
|
} |
|
hull.color1 = "#806682"; |
|
hull.color2 = "#4D4D80"; |
|
hull.ApplyForceToCenter(new b2.Vec2(force_to_center, 0), true); |
|
hull.SetUserData(new CustomBodyUserData(true, this.reset_on_hull_critical_contact, "hull")); |
|
this.body_parts.push(hull); |
|
this.reference_head_object = hull; |
|
|
|
|
|
for(let i of [-1, +1]){ |
|
|
|
|
|
let leg_bd = new b2.BodyDef(); |
|
leg_bd.type = b2.Body.b2_dynamicBody; |
|
leg_bd.position.Set(init_x, init_y - this.LEG_H / 2 - this.LEG_DOWN + y_offset); |
|
|
|
let leg = world.CreateBody(leg_bd); |
|
leg.CreateFixture(LEG_FD); |
|
leg.color1 = i == -1 ? "#9C4F82" : "#964A7D"; |
|
leg.color2 = i == -1 ? "#69364F" : "#63304A"; |
|
leg.SetUserData(new CustomBodyUserData(false, false,"leg")); |
|
this.body_parts.push(leg); |
|
|
|
|
|
let leg_rjd = new b2.RevoluteJointDef(); |
|
leg_rjd.Initialize(hull, leg, new b2.Vec2(init_x, init_y - this.LEG_DOWN + y_offset)); |
|
leg_rjd.enableMotor = true; |
|
leg_rjd.enableLimit = true; |
|
leg_rjd.maxMotorTorque = this.MOTORS_TORQUE; |
|
leg_rjd.motorSpeed = i; |
|
leg_rjd.lowerAngle = - 0.8; |
|
leg_rjd.upperAngle = 1.1; |
|
let joint_motor = world.CreateJoint(leg_rjd); |
|
joint_motor.SetUserData(new CustomMotorUserData("hip", SPEED_HIP, false)); |
|
this.motors.push(joint_motor); |
|
|
|
|
|
let lower_bd = new b2.BodyDef(); |
|
lower_bd.type = b2.Body.b2_dynamicBody; |
|
lower_bd.position.Set(init_x, init_y - this.LEG_H * 3 / 2 - this.LEG_DOWN + y_offset); |
|
|
|
let lower = world.CreateBody(lower_bd); |
|
lower.CreateFixture(LOWER_FD); |
|
lower.color1 = i == -1 ? "#9C4F82" : "#964A7D"; |
|
lower.color2 = i == -1 ? "#69364F" : "#63304A"; |
|
lower.SetUserData(new CustomBodyUserData(true, false,"lower")); |
|
this.body_parts.push(lower); |
|
|
|
|
|
let lower_rjd = new b2.RevoluteJointDef(); |
|
lower_rjd.Initialize(leg, lower, new b2.Vec2(init_x, init_y - this.LEG_DOWN - this.LEG_H + y_offset)); |
|
lower_rjd.enableMotor = true; |
|
lower_rjd.enableLimit = true; |
|
lower_rjd.maxMotorTorque = this.MOTORS_TORQUE; |
|
lower_rjd.motorSpeed = 1; |
|
lower_rjd.lowerAngle = - 1.6; |
|
lower_rjd.upperAngle = -0.1; |
|
joint_motor = world.CreateJoint(lower_rjd); |
|
joint_motor.SetUserData(new CustomMotorUserData("knee", SPEED_KNEE, true, 1.0, lower)); |
|
this.motors.push(joint_motor); |
|
} |
|
} |
|
} |