File: src/constraints/LockConstraint.js
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);
};