Spaces:
Running
Running
/** | |
* @author sunag / http://www.sunag.com.br/ | |
*/ | |
import { Vector3Node } from '../inputs/Vector3Node.js'; | |
function VelocityNode( target, params ) { | |
Vector3Node.call( this ); | |
this.params = {}; | |
this.velocity = new THREE.Vector3(); | |
this.setTarget( target ); | |
this.setParams( params ); | |
} | |
VelocityNode.prototype = Object.create( Vector3Node.prototype ); | |
VelocityNode.prototype.constructor = VelocityNode; | |
VelocityNode.prototype.nodeType = "Velocity"; | |
VelocityNode.prototype.getReadonly = function ( builder ) { | |
return false; | |
}; | |
VelocityNode.prototype.setParams = function ( 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 THREE.Vector3(); | |
this.speed = new THREE.Vector3(); | |
this.springVelocity = new THREE.Vector3(); | |
this.lastVelocity = new THREE.Vector3(); | |
break; | |
} | |
}; | |
VelocityNode.prototype.setTarget = function ( target ) { | |
if ( this.target ) { | |
delete this.position; | |
delete this.oldPosition; | |
} | |
this.target = target; | |
if ( target ) { | |
this.position = target.getWorldPosition( this.position || new THREE.Vector3() ); | |
this.oldPosition = this.position.clone(); | |
} | |
}; | |
VelocityNode.prototype.updateFrameVelocity = function ( frame ) { | |
if ( this.target ) { | |
this.position = this.target.getWorldPosition( this.position || new THREE.Vector3() ); | |
this.velocity.subVectors( this.position, this.oldPosition ); | |
this.oldPosition.copy( this.position ); | |
} | |
}; | |
VelocityNode.prototype.updateFrame = function ( frame ) { | |
this.updateFrameVelocity( frame ); | |
switch ( this.params.type ) { | |
case "elastic": | |
// convert to real scale: 0 at 1 values | |
var deltaFps = frame.delta * ( this.params.fps || 60 ); | |
var 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 ); | |
} | |
}; | |
VelocityNode.prototype.copy = function ( source ) { | |
Vector3Node.prototype.copy.call( this, source ); | |
if ( source.target ) object.setTarget( source.target ); | |
object.setParams( source.params ); | |
}; | |
VelocityNode.prototype.toJSON = function ( meta ) { | |
var data = this.getJSONNode( meta ); | |
if ( ! data ) { | |
data = this.createJSONNode( meta ); | |
if ( this.target ) data.target = this.target.uuid; | |
// clone params | |
data.params = JSON.parse( JSON.stringify( this.params ) ); | |
} | |
return data; | |
}; | |
export { VelocityNode }; | |