import PhysicsEngine from './PhysicsEngine';
const CANNON = require('cannon');
/**
* CannonPhysicsEngine is a three-dimensional lightweight physics engine
*/
class CannonPhysicsEngine extends PhysicsEngine {
constructor(options) {
super(options);
this.options.dt = this.options.dt || (1 / 60);
let world = this.world = new CANNON.World();
world.quatNormalizeSkip = 0;
world.quatNormalizeFast = false;
world.gravity.set(0, -10, 0);
world.broadphase = new CANNON.NaiveBroadphase();
this.CANNON = CANNON;
}
// entry point for a single step of the Simple Physics
step(dt, objectFilter) {
this.world.step(dt || this.options.dt);
}
addSphere(radius, mass) {
let shape = new CANNON.Sphere(radius);
let body = new CANNON.Body({ mass, shape });
body.position.set(0, 0, 0);
this.world.addBody(body);
return body;
}
addBox(x, y, z, mass, friction) {
let shape = new CANNON.Box(new CANNON.Vec3(x, y, z));
let options = { mass, shape };
if (friction !== undefined)
options.material = new CANNON.Material({ friction });
let body = new CANNON.Body(options);
body.position.set(0, 0, 0);
this.world.addBody(body);
return body;
}
addCylinder(radiusTop, radiusBottom, height, numSegments, mass) {
let shape = new CANNON.Cylinder(radiusTop, radiusBottom, height, numSegments);
let body = new CANNON.Body({ mass, shape });
this.world.addBody(body);
return body;
}
removeObject(obj) {
this.world.removeBody(obj);
}
}
export default CannonPhysicsEngine;