Skip to content
Snippets Groups Projects
Select Git revision
  • b467813601be046cf3b4cfb60d7b1284eafa3fcd
  • main default protected
  • rewrite
  • simulation-old
4 results

Springs.ts

Blame
  • 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;
        }
    }