File: src/equations/FrictionEquation.js
module.exports = FrictionEquation;
var Equation = require('./Equation');
var Vec3 = require('../math/Vec3');
var Mat3 = require('../math/Mat3');
/**
* Constrains the slipping in a contact along a tangent
* @class FrictionEquation
* @constructor
* @author schteppe
* @param {Body} bodyA
* @param {Body} bodyB
* @param {Number} slipForce should be +-F_friction = +-mu * F_normal = +-mu * m * g
* @extends Equation
*/
function FrictionEquation(bodyA, bodyB, slipForce){
Equation.call(this,bodyA, bodyB, -slipForce, slipForce);
this.ri = new Vec3();
this.rj = new Vec3();
this.t = new Vec3(); // tangent
}
FrictionEquation.prototype = new Equation();
FrictionEquation.prototype.constructor = FrictionEquation;
var FrictionEquation_computeB_temp1 = new Vec3();
var FrictionEquation_computeB_temp2 = new Vec3();
FrictionEquation.prototype.computeB = function(h){
var a = this.a,
b = this.b,
bi = this.bi,
bj = this.bj,
ri = this.ri,
rj = this.rj,
rixt = FrictionEquation_computeB_temp1,
rjxt = FrictionEquation_computeB_temp2,
t = this.t;
// Caluclate cross products
ri.cross(t,rixt);
rj.cross(t,rjxt);
// G = [-t -rixt t rjxt]
// And remember, this is a pure velocity constraint, g is always zero!
var GA = this.jacobianElementA,
GB = this.jacobianElementB;
t.negate(GA.spatial);
rixt.negate(GA.rotational);
GB.spatial.copy(t);
GB.rotational.copy(rjxt);
var GW = this.computeGW();
var GiMf = this.computeGiMf();
var B = - GW * b - h * GiMf;
return B;
};