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