| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 | import { Vector3 } from '../../../../build/three.module.js';import { Vector3Node } from '../inputs/Vector3Node.js';class VelocityNode extends Vector3Node {	constructor( target, params ) {		super();		this.params = {};		this.velocity = new Vector3();		this.setTarget( target );		this.setParams( params );	}	getReadonly( /*builder*/ ) {		return false;	}	setParams( params ) {		switch ( this.params.type ) {			case 'elastic':				delete this.moment;				delete this.speed;				delete this.springVelocity;				delete this.lastVelocity;				break;		}		this.params = params || {};		switch ( this.params.type ) {			case 'elastic':				this.moment = new Vector3();				this.speed = new Vector3();				this.springVelocity = new Vector3();				this.lastVelocity = new Vector3();				break;		}	}	setTarget( target ) {		if ( this.target ) {			delete this.position;			delete this.oldPosition;		}		this.target = target;		if ( target ) {			this.position = target.getWorldPosition( this.position || new Vector3() );			this.oldPosition = this.position.clone();		}	}	updateFrameVelocity( /*frame*/ ) {		if ( this.target ) {			this.position = this.target.getWorldPosition( this.position || new Vector3() );			this.velocity.subVectors( this.position, this.oldPosition );			this.oldPosition.copy( this.position );		}	}	updateFrame( frame ) {		this.updateFrameVelocity( frame );		switch ( this.params.type ) {			case 'elastic':				// convert to real scale: 0 at 1 values				const deltaFps = frame.delta * ( this.params.fps || 60 );				const spring = Math.pow( this.params.spring, deltaFps ),					damping = Math.pow( this.params.damping, deltaFps );				// fix relative frame-rate				this.velocity.multiplyScalar( Math.exp( - this.params.damping * deltaFps ) );				// elastic				this.velocity.add( this.springVelocity );				this.velocity.add( this.speed.multiplyScalar( damping ).multiplyScalar( 1 - spring ) );				// speed				this.speed.subVectors( this.velocity, this.lastVelocity );				// spring velocity				this.springVelocity.add( this.speed );				this.springVelocity.multiplyScalar( spring );				// moment				this.moment.add( this.springVelocity );				// damping				this.moment.multiplyScalar( damping );				this.lastVelocity.copy( this.velocity );				this.value.copy( this.moment );				break;			default:				this.value.copy( this.velocity );		}	}	copy( source ) {		super.copy( source );		if ( source.target ) this.setTarget( source.target );		this.setParams( source.params );		return this;	}	toJSON( meta ) {		const data = super.toJSON( meta );		if ( this.target ) data.target = this.target.uuid;		// clone params		data.params = JSON.parse( JSON.stringify( this.params ) );		return data;	}}VelocityNode.prototype.nodeType = 'Velocity';export { VelocityNode };
 |