threex
Version:
Game Extensions for three.js http://www.threejsgames.com/extensions/
74 lines (62 loc) • 2.33 kB
JavaScript
var THREEx = THREEx || {}
THREEx.TweenControls = function(object3d){
var startTime = null
var startPosition = new THREE.Vector3
var finalPosition = new THREE.Vector3
var startQuaternion = new THREE.Quaternion
var finalQuaternion = new THREE.Quaternion
var startScale = new THREE.Vector3
var finalScale = new THREE.Vector3
this.tweenDelay = 1
// to set the tween function
// - for a full list, see tween.js TWEEN.Easing in https://github.com/sole/tween.js/blob/master/src/Tween.js
this.tweenFunction = function(progress){
return progress
}
this.setTarget = function(newPosition, newQuaternion, newScale){
// handle default arguments
newPosition = newPosition || object3d.position
newQuaternion = newQuaternion || object3d.quaternion
newScale = newScale || object3d.scale
// set startTime
startTime = Date.now()/1000
// set position
startPosition.copy(object3d.position)
finalPosition.copy(newPosition)
// set quaternion
startQuaternion.copy(object3d.quaternion)
finalQuaternion.copy(newQuaternion)
// set scale
startScale.copy(object3d.scale)
finalScale.copy(newScale)
}
this.isRunning = function(){
return startTime !== null ? true : false
}
this.update = function(){
// return now if no tweening is in progress
if( startTime === null ) return
var now = Date.now()/1000
// if tweening just completed, set it to final position
if( now - startTime > this.tweenDelay ){
object3d.position.copy(finalPosition)
startTime = null
return
}
// compute and tween progress
var progress = (now - startTime) / this.tweenDelay
progress = this.tweenFunction(progress)
// Position - compute and set current delta position based on progress
var distance = finalPosition.distanceTo(startPosition) * progress
var delta = finalPosition.clone().sub(startPosition)
delta.setLength(distance)
object3d.position.copy(startPosition).add(delta)
// Quaternion - compute and set current delta position based on progress
object3d.quaternion.copy(startQuaternion).slerp(finalQuaternion, progress)
// Scale - compute and set current delta position based on progress
var distance = finalScale.distanceTo(startScale) * progress
var delta = finalScale.clone().sub(startScale)
delta.setLength(distance)
object3d.scale.copy(startScale).add(delta)
}
}