File: src/equations/FrictionEquation.js
var vec2 = require('../math/vec2')
, Equation = require('./Equation')
, Utils = require('../utils/Utils');
module.exports = FrictionEquation;
/**
* Constrains the slipping in a contact along a tangent
*
* @class FrictionEquation
* @constructor
* @param {Body} bodyA
* @param {Body} bodyB
* @param {Number} slipForce
* @extends Equation
*/
function FrictionEquation(bodyA, bodyB, slipForce){
Equation.call(this, bodyA, bodyB, -slipForce, slipForce);
/**
* Relative vector from center of body A to the contact point, world oriented.
* @property contactPointA
* @type {Array}
*/
this.contactPointA = vec2.create();
/**
* Relative vector from center of body B to the contact point, world oriented.
* @property contactPointB
* @type {Array}
*/
this.contactPointB = vec2.create();
/**
* Tangent vector that the friction force will act along. World oriented.
* @property t
* @type {Array}
*/
this.t = vec2.create();
/**
* A ContactEquation connected to this friction. The contact equation can be used to rescale the max force for the friction.
* @property contactEquation
* @type {ContactEquation}
*/
this.contactEquation = null;
/**
* The shape in body i that triggered this friction.
* @property shapeA
* @type {Shape}
* @todo Needed? The shape can be looked up via contactEquation.shapeA...
*/
this.shapeA = null;
/**
* The shape in body j that triggered this friction.
* @property shapeB
* @type {Shape}
* @todo Needed? The shape can be looked up via contactEquation.shapeB...
*/
this.shapeB = null;
/**
* The friction coefficient to use.
* @property frictionCoefficient
* @type {Number}
*/
this.frictionCoefficient = 0.3;
}
FrictionEquation.prototype = new Equation();
FrictionEquation.prototype.constructor = FrictionEquation;
/**
* Set the slipping condition for the constraint. The friction force cannot be
* larger than this value.
* @method setSlipForce
* @param {Number} slipForce
*/
FrictionEquation.prototype.setSlipForce = function(slipForce){
this.maxForce = slipForce;
this.minForce = -slipForce;
};
/**
* Get the max force for the constraint.
* @method getSlipForce
* @return {Number}
*/
FrictionEquation.prototype.getSlipForce = function(){
return this.maxForce;
};
FrictionEquation.prototype.computeB = function(a,b,h){
var bi = this.bodyA,
bj = this.bodyB,
ri = this.contactPointA,
rj = this.contactPointB,
t = this.t,
G = this.G;
// G = [-t -rixt t rjxt]
// And remember, this is a pure velocity constraint, g is always zero!
G[0] = -t[0];
G[1] = -t[1];
G[2] = -vec2.crossLength(ri,t);
G[3] = t[0];
G[4] = t[1];
G[5] = vec2.crossLength(rj,t);
var GW = this.computeGW(),
GiMf = this.computeGiMf();
var B = /* - g * a */ - GW * b - h*GiMf;
return B;
};