#

API Docs for: 0.6.1
Show: Inherited Protected Private Deprecated

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