UNPKG

cannon

Version:

A lightweight 3D physics engine written in JavaScript.

60 lines (50 loc) 1.61 kB
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; };