File: src/equations/RotationalEquation.js
module.exports = RotationalEquation;
var Vec3 = require('../math/Vec3');
var Mat3 = require('../math/Mat3');
var Equation = require('./Equation');
/**
* Rotational constraint. Works to keep the local vectors orthogonal to each other in world space.
* @class RotationalEquation
* @constructor
* @author schteppe
* @param {Body} bodyA
* @param {Body} bodyB
* @param {Vec3} [options.axisA]
* @param {Vec3} [options.axisB]
* @param {number} [options.maxForce]
* @extends Equation
*/
function RotationalEquation(bodyA, bodyB, options){
options = options || {};
var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;
Equation.call(this,bodyA,bodyB,-maxForce, maxForce);
this.axisA = options.axisA ? options.axisA.clone() : new Vec3(1, 0, 0);
this.axisB = options.axisB ? options.axisB.clone() : new Vec3(0, 1, 0);
this.maxAngle = Math.PI / 2;
}
RotationalEquation.prototype = new Equation();
RotationalEquation.prototype.constructor = RotationalEquation;
var tmpVec1 = new Vec3();
var tmpVec2 = new Vec3();
RotationalEquation.prototype.computeB = function(h){
var a = this.a,
b = this.b,
ni = this.axisA,
nj = this.axisB,
nixnj = tmpVec1,
njxni = tmpVec2,
GA = this.jacobianElementA,
GB = this.jacobianElementB;
// Caluclate cross products
ni.cross(nj, nixnj);
nj.cross(ni, njxni);
// g = ni * nj
// gdot = (nj x ni) * wi + (ni x nj) * wj
// G = [0 njxni 0 nixnj]
// W = [vi wi vj wj]
GA.rotational.copy(njxni);
GB.rotational.copy(nixnj);
var g = Math.cos(this.maxAngle) - ni.dot(nj),
GW = this.computeGW(),
GiMf = this.computeGiMf();
var B = - g * a - GW * b - h * GiMf;
return B;
};