UNPKG

cannon

Version:

A lightweight 3D physics engine written in JavaScript.

80 lines (65 loc) 2.69 kB
module.exports = LockConstraint; var Constraint = require('./Constraint'); var PointToPointConstraint = require('./PointToPointConstraint'); var RotationalEquation = require('../equations/RotationalEquation'); var RotationalMotorEquation = require('../equations/RotationalMotorEquation'); var ContactEquation = require('../equations/ContactEquation'); var Vec3 = require('../math/Vec3'); /** * Lock constraint. Will remove all degrees of freedom between the bodies. * @class LockConstraint * @constructor * @author schteppe * @param {Body} bodyA * @param {Body} bodyB * @param {object} [options] * @param {Number} [options.maxForce=1e6] * @extends PointToPointConstraint */ function LockConstraint(bodyA, bodyB, options){ options = options || {}; var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6; // Set pivot point in between var pivotA = new Vec3(); var pivotB = new Vec3(); var halfWay = new Vec3(); bodyA.position.vadd(bodyB.position, halfWay); halfWay.scale(0.5, halfWay); bodyB.pointToLocalFrame(halfWay, pivotB); bodyA.pointToLocalFrame(halfWay, pivotA); PointToPointConstraint.call(this, bodyA, pivotA, bodyB, pivotB, maxForce); /** * @property {RotationalEquation} rotationalEquation1 */ var r1 = this.rotationalEquation1 = new RotationalEquation(bodyA,bodyB,options); /** * @property {RotationalEquation} rotationalEquation2 */ var r2 = this.rotationalEquation2 = new RotationalEquation(bodyA,bodyB,options); /** * @property {RotationalEquation} rotationalEquation3 */ var r3 = this.rotationalEquation3 = new RotationalEquation(bodyA,bodyB,options); this.equations.push(r1, r2, r3); } LockConstraint.prototype = new PointToPointConstraint(); LockConstraint.constructor = LockConstraint; var LockConstraint_update_tmpVec1 = new Vec3(); var LockConstraint_update_tmpVec2 = new Vec3(); LockConstraint.prototype.update = function(){ var bodyA = this.bodyA, bodyB = this.bodyB, motor = this.motorEquation, r1 = this.rotationalEquation1, r2 = this.rotationalEquation2, r3 = this.rotationalEquation3, worldAxisA = LockConstraint_update_tmpVec1, worldAxisB = LockConstraint_update_tmpVec2; PointToPointConstraint.prototype.update.call(this); bodyA.vectorToWorldFrame(Vec3.UNIT_X, r1.axisA); bodyB.vectorToWorldFrame(Vec3.UNIT_Y, r1.axisB); bodyA.vectorToWorldFrame(Vec3.UNIT_Y, r2.axisA); bodyB.vectorToWorldFrame(Vec3.UNIT_Z, r2.axisB); bodyA.vectorToWorldFrame(Vec3.UNIT_Z, r3.axisA); bodyB.vectorToWorldFrame(Vec3.UNIT_X, r3.axisB); };