Select Git revision
-
Nitin Madhok authoredNitin Madhok authored
Springs.ts 2.65 KiB
import * as THREE from 'three';
export interface SpringParameters {
// spring traits
positionA: THREE.Vector3;
positionB: THREE.Vector3;
// internal parameters
constants: SpringConstants;
// visuals
color: number;
}
export abstract class Spring {
public positionA: THREE.Vector3;
public positionB: THREE.Vector3;
public restingLength: number;
public line: THREE.Line;
constructor(params: SpringParameters) {
this.positionA = params.positionA;
this.positionB = params.positionB;
this.restingLength = this.positionA.distanceTo(this.positionB);
this.line = new THREE.Line(
new THREE.BufferGeometry().setFromPoints([this.positionA, this.positionB]),
new THREE.LineBasicMaterial({ color: params.color })
);
}
abstract get springConstant(): number;
public force(x: number, y: number, z: number): THREE.Vector3 {
let direction = this.positionB.clone().sub(this.positionA);
const distance = direction.length();
direction.normalize();
const sign = distance / Math.abs(distance);
const result = direction.multiplyScalar(this.springConstant * (distance - this.restingLength) * sign);
if (this.positionA === new THREE.Vector3(x, y, z)) {
return result;
}
return result.multiplyScalar(-1);
}
public setColor(color: number): void {
(this.line.material as THREE.LineBasicMaterial).color.set(color);
}
notify(): void {
this.line.geometry.setFromPoints([this.positionA, this.positionB]);
}
}
export class SpringConstants {
public structural: number = 1;
public shear: number = 1;
public bend: number = 1;
}
export class StructuralSpring extends Spring {
public constants: SpringConstants;
constructor(params: SpringParameters) {
super(params);
this.constants = params.constants;
}
get springConstant(): number {
return this.constants.structural;
}
}
export class ShearSpring extends Spring {
public constants: SpringConstants;
constructor(params: SpringParameters) {
super(params);
this.constants = params.constants;
}
get springConstant(): number {
return this.constants.shear;
}
}
export class BendingSpring extends Spring {
public constants: SpringConstants;
constructor(params: SpringParameters) {
super(params);
this.constants = params.constants;
}
get springConstant(): number {
return this.constants.bend;
}
}