UNPKG

cannon

Version:

A lightweight 3D physics engine written in JavaScript.

92 lines (78 loc) 2.9 kB
module.exports = PointToPointConstraint; var Constraint = require('./Constraint'); var ContactEquation = require('../equations/ContactEquation'); var Vec3 = require('../math/Vec3'); /** * Connects two bodies at given offset points. * @class PointToPointConstraint * @extends Constraint * @constructor * @param {Body} bodyA * @param {Vec3} pivotA The point relative to the center of mass of bodyA which bodyA is constrained to. * @param {Body} bodyB Body that will be constrained in a similar way to the same point as bodyA. We will therefore get a link between bodyA and bodyB. If not specified, bodyA will be constrained to a static point. * @param {Vec3} pivotB See pivotA. * @param {Number} maxForce The maximum force that should be applied to constrain the bodies. * * @example * var bodyA = new Body({ mass: 1 }); * var bodyB = new Body({ mass: 1 }); * bodyA.position.set(-1, 0, 0); * bodyB.position.set(1, 0, 0); * bodyA.addShape(shapeA); * bodyB.addShape(shapeB); * world.addBody(bodyA); * world.addBody(bodyB); * var localPivotA = new Vec3(1, 0, 0); * var localPivotB = new Vec3(-1, 0, 0); * var constraint = new PointToPointConstraint(bodyA, localPivotA, bodyB, localPivotB); * world.addConstraint(constraint); */ function PointToPointConstraint(bodyA,pivotA,bodyB,pivotB,maxForce){ Constraint.call(this,bodyA,bodyB); maxForce = typeof(maxForce) !== 'undefined' ? maxForce : 1e6; /** * Pivot, defined locally in bodyA. * @property {Vec3} pivotA */ this.pivotA = pivotA ? pivotA.clone() : new Vec3(); /** * Pivot, defined locally in bodyB. * @property {Vec3} pivotB */ this.pivotB = pivotB ? pivotB.clone() : new Vec3(); /** * @property {ContactEquation} equationX */ var x = this.equationX = new ContactEquation(bodyA,bodyB); /** * @property {ContactEquation} equationY */ var y = this.equationY = new ContactEquation(bodyA,bodyB); /** * @property {ContactEquation} equationZ */ var z = this.equationZ = new ContactEquation(bodyA,bodyB); // Equations to be fed to the solver this.equations.push(x, y, z); // Make the equations bidirectional x.minForce = y.minForce = z.minForce = -maxForce; x.maxForce = y.maxForce = z.maxForce = maxForce; x.ni.set(1, 0, 0); y.ni.set(0, 1, 0); z.ni.set(0, 0, 1); } PointToPointConstraint.prototype = new Constraint(); PointToPointConstraint.prototype.update = function(){ var bodyA = this.bodyA; var bodyB = this.bodyB; var x = this.equationX; var y = this.equationY; var z = this.equationZ; // Rotate the pivots to world space bodyA.quaternion.vmult(this.pivotA,x.ri); bodyB.quaternion.vmult(this.pivotB,x.rj); y.ri.copy(x.ri); y.rj.copy(x.rj); z.ri.copy(x.ri); z.rj.copy(x.rj); };