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;
- };
-
-