File: src/objects/RotationalSpring.js
var vec2 = require('../math/vec2');
var Spring = require('./Spring');
module.exports = RotationalSpring;
/**
* A rotational spring, connecting two bodies rotation. This spring explicitly adds angularForce (torque) to the bodies.
*
* The spring can be combined with a {{#crossLink "RevoluteConstraint"}}{{/crossLink}} to make, for example, a mouse trap.
*
* @class RotationalSpring
* @extends Spring
* @constructor
* @param {Body} bodyA
* @param {Body} bodyB
* @param {Object} [options]
* @param {number} [options.restAngle] The relative angle of bodies at which the spring is at rest. If not given, it's set to the current relative angle between the bodies.
* @param {number} [options.stiffness=100] Spring constant (see Hookes Law). A number >= 0.
* @param {number} [options.damping=1] A number >= 0.
*/
function RotationalSpring(bodyA, bodyB, options){
options = options || {};
Spring.call(this, bodyA, bodyB, options);
/**
* Rest angle of the spring.
* @property restAngle
* @type {number}
*/
this.restAngle = typeof(options.restAngle) === "number" ? options.restAngle : bodyB.angle - bodyA.angle;
}
RotationalSpring.prototype = new Spring();
RotationalSpring.prototype.constructor = RotationalSpring;
/**
* Apply the spring force to the connected bodies.
* @method applyForce
*/
RotationalSpring.prototype.applyForce = function(){
var k = this.stiffness,
d = this.damping,
l = this.restAngle,
bodyA = this.bodyA,
bodyB = this.bodyB,
x = bodyB.angle - bodyA.angle,
u = bodyB.angularVelocity - bodyA.angularVelocity;
var torque = - k * (x - l) - d * u * 0;
bodyA.angularForce -= torque;
bodyB.angularForce += torque;
};