planck.js - Car

by 亮 薛

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/planck-js/0.1.37/planck-with-testbed.min.js"></script>

JavaScript

planck.testbed('Car', function(testbed) {

  testbed.speed = 1.3;
  testbed.hz = 1 / 50;

  testbed.height = 40;
  testbed.width = 100;

  var pl = planck,
    Vec2 = pl.Vec2;
  var world = new pl.World({
    gravity: Vec2(0, -10)
  });

  // wheel spring settings
  var HZ = 4.0;
  var ZETA = 0.7;
  var SPEED = 50.0;

  var ground = world.createBody();

  var groundFD = {
    density: 0.0,
    friction: 0.6
  };

  ground.createFixture(pl.Edge(Vec2(-20.0, 0.0), Vec2(20.0, 0.0)), groundFD);

  var hs = [0.25, 1.0, 4.0, 0.0, 0.0, -1.0, -2.0, -2.0, -1.25, 0.0];

  var x = 20.0,
    y1 = 0.0,
    dx = 5.0;

  for (var i = 0; i < 10; ++i) {
    var y2 = hs[i];
    ground.createFixture(pl.Edge(Vec2(x, y1), Vec2(x + dx, y2)), groundFD);
    y1 = y2;
    x += dx;
  }

  for (var i = 0; i < 10; ++i) {
    var y2 = hs[i];
    ground.createFixture(pl.Edge(Vec2(x, y1), Vec2(x + dx, y2)), groundFD);
    y1 = y2;
    x += dx;
  }

  ground.createFixture(pl.Edge(Vec2(x, 0.0), Vec2(x + 40.0, 0.0)), groundFD);

  x += 80.0;
  ground.createFixture(pl.Edge(Vec2(x, 0.0), Vec2(x + 40.0, 0.0)), groundFD);

  x += 40.0;
  ground.createFixture(pl.Edge(Vec2(x, 0.0), Vec2(x + 10.0, 5.0)), groundFD);

  x += 20.0;
  ground.createFixture(pl.Edge(Vec2(x, 0.0), Vec2(x + 40.0, 0.0)), groundFD);

  x += 40.0;
  ground.createFixture(pl.Edge(Vec2(x, 0.0), Vec2(x, 20.0)), groundFD);

  // Teeter
  var teeter = world.createDynamicBody(Vec2(140.0, 1.0));
  teeter.createFixture(pl.Box(10.0, 0.25), 1.0);
  world.createJoint(pl.RevoluteJoint({
    lowerAngle: -8.0 * Math.PI / 180.0,
    upperAngle: 8.0 * Math.PI / 180.0,
    enableLimit: true
  }, ground, teeter, teeter.getPosition()));

  teeter.applyAngularImpulse(100.0, true);

  // Bridge
  var bridgeFD = {};
  bridgeFD.density = 1.0;
  bridgeFD.friction = 0.6;

  var prevBody = ground;
  for (var i = 0; i < 20; ++i) {
    var bridgeBlock = world.createDynamicBody(Vec2(161.0 + 2.0 * i, -0.125));
    bridgeBlock.createFixture(pl.Box(1.0, 0.125),...