cannon-es-control
Version:
A lightweight 3D physics engine written in JavaScript with control system tools
51 lines (43 loc) • 1.54 kB
text/typescript
import { Constraint } from '../constraints/Constraint'
import { ContactEquation } from '../equations/ContactEquation'
import type { Body } from '../objects/Body'
/**
* Constrains two bodies to be at a constant distance from each others center of mass.
*/
export class DistanceConstraint extends Constraint {
/**
* The distance to keep. If undefined, it will be set to the current distance between bodyA and bodyB
*/
distance: number
distanceEquation: ContactEquation
/**
* @param distance The distance to keep. If undefined, it will be set to the current distance between bodyA and bodyB.
* @param maxForce The maximum force that should be applied to constrain the bodies.
*/
constructor(bodyA: Body, bodyB: Body, distance?: number, maxForce = 1e6) {
super(bodyA, bodyB)
if (typeof distance === 'undefined') {
distance = bodyA.position.distanceTo(bodyB.position)
}
this.distance = distance!
const eq = (this.distanceEquation = new ContactEquation(bodyA, bodyB))
this.equations.push(eq)
// Make it bidirectional
eq.minForce = -maxForce
eq.maxForce = maxForce
}
/**
* update
*/
update(): void {
const bodyA = this.bodyA
const bodyB = this.bodyB
const eq = this.distanceEquation
const halfDist = this.distance * 0.5
const normal = eq.ni
bodyB.position.vsub(bodyA.position, normal)
normal.normalize()
normal.scale(halfDist, eq.ri)
normal.scale(-halfDist, eq.rj)
}
}