File: src/equations/RotationalMotorEquation.js
module.exports = RotationalMotorEquation;
var Vec3 = require('../math/Vec3');
var Mat3 = require('../math/Mat3');
var Equation = require('./Equation');
/**
* Rotational motor constraint. Tries to keep the relative angular velocity of the bodies to a given value.
* @class RotationalMotorEquation
* @constructor
* @author schteppe
* @param {Body} bodyA
* @param {Body} bodyB
* @param {Number} maxForce
* @extends Equation
*/
function RotationalMotorEquation(bodyA, bodyB, maxForce){
maxForce = typeof(maxForce)!=='undefined' ? maxForce : 1e6;
Equation.call(this,bodyA,bodyB,-maxForce,maxForce);
/**
* World oriented rotational axis
* @property {Vec3} axisA
*/
this.axisA = new Vec3();
/**
* World oriented rotational axis
* @property {Vec3} axisB
*/
this.axisB = new Vec3(); // World oriented rotational axis
/**
* Motor velocity
* @property {Number} targetVelocity
*/
this.targetVelocity = 0;
}
RotationalMotorEquation.prototype = new Equation();
RotationalMotorEquation.prototype.constructor = RotationalMotorEquation;
RotationalMotorEquation.prototype.computeB = function(h){
var a = this.a,
b = this.b,
bi = this.bi,
bj = this.bj,
axisA = this.axisA,
axisB = this.axisB,
GA = this.jacobianElementA,
GB = this.jacobianElementB;
// g = 0
// gdot = axisA * wi - axisB * wj
// gdot = G * W = G * [vi wi vj wj]
// =>
// G = [0 axisA 0 -axisB]
GA.rotational.copy(axisA);
axisB.negate(GB.rotational);
var GW = this.computeGW() - this.targetVelocity,
GiMf = this.computeGiMf();
var B = - GW * b - h * GiMf;
return B;
};