cannon-es-control
Version:
A lightweight 3D physics engine written in JavaScript with control system tools
59 lines (48 loc) • 1.5 kB
text/typescript
import { Equation } from '../equations/Equation'
import { Vec3 } from '../math/Vec3'
import type { Body } from '../objects/Body'
/**
* Constrains the slipping in a contact along a tangent
*/
export class FrictionEquation extends Equation {
ri: Vec3
rj: Vec3
t: Vec3 // Tangent
/**
* @param slipForce should be +-F_friction = +-mu * F_normal = +-mu * m * g
*/
constructor(bodyA: Body, bodyB: Body, slipForce: number) {
super(bodyA, bodyB, -slipForce, slipForce)
this.ri = new Vec3()
this.rj = new Vec3()
this.t = new Vec3()
}
computeB(h: number): number {
const a = this.a
const b = this.b
const bi = this.bi
const bj = this.bj
const ri = this.ri
const rj = this.rj
const rixt = FrictionEquation_computeB_temp1
const rjxt = FrictionEquation_computeB_temp2
const 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!
const GA = this.jacobianElementA
const GB = this.jacobianElementB
t.negate(GA.spatial)
rixt.negate(GA.rotational)
GB.spatial.copy(t)
GB.rotational.copy(rjxt)
const GW = this.computeGW()
const GiMf = this.computeGiMf()
const B = -GW * b - h * GiMf
return B
}
}
const FrictionEquation_computeB_temp1 = new Vec3()
const FrictionEquation_computeB_temp2 = new Vec3()