我正在使用tweenjs和Typescript来更改three.js多维数据集的x和y坐标。我创建了以下补间来更改“FallingItem”类的项目的x位置。
this.movementArcData.horzTween = new TWEEN.Tween(this.movementArcData.pos.x)
.to(this.movementArcData.newPos.x, this.movementArcData.movementTime * 1000)
.onUpdate(this.updateXPos)
.onComplete(this.horzTweenComplete);
其中“this.movementArcData”是包含以下内容的对象:
pos.x - 项目的原始位置
movementTime - 完成移动所需的时间,2000毫秒
updateXPos - 具有以下代码的FallingItem对象的成员函数:
updateXPos(){ this.mesh.position.x = this.movementArcData.pos.x; console.log(“update x:”+ this.movementArcData.pos.x); }
horzTweenComplete - FallingItem对象的成员函数,代码如下:
horzTweenComplete(){
this.movementArcData.horzTweenComplete = true;
}
updateXPos或horzTweenComplete回调都没有被触发。
我在渲染循环中调用TWEEN.update,如下所示:
TWEEN.update(dt);
由于补间的onComplete事件永远不会触发,因此会不断调用TWEEN.update。我错过了什么导致补间无法正常工作?
答案 0 :(得分:2)
Tween.js需要传递经过的时间,而不是增量时间。传递正在运行的时间可以解决问题。
此外,它应该传递一个包含您想要插值的对象。看起来传递值本身并不起作用。我成功了:
let tweenElement = {
x: this.tweenInfo.pos.x,
y: this.tweenInfo.pos.y,
item: this
}
this.tweenInfo.tweenUp = new TWEEN.Tween(tweenElement)
.to({y : this.tweenInfo.newPos.y}
, this.tweenInfo.movementTime * 0.5 * 1000)
.easing( TWEEN.Easing.Cubic.InOut )
.onUpdate(function(){
this.item.updateYPos(tweenElement, this)
})
.onComplete(function(){
this.item.tweenUpComplete();
});
答案 1 :(得分:2)
当TWEEN
没有调用我的onUpdate
函数时,我遇到了类似的情况。发现我必须调用window.requestAnimationFrame()
以告诉浏览器我,即TWEEN
,“想要执行动画并请求浏览器调用指定的函数以在下一次重绘之前更新动画。“
function animate(time) {
window.requestAnimationFrame(animate);
TWEEN.update(time);
}
new TWEEN
.Tween({ y: 0 })
.to({y: 1000}, 700)
.easing(TWEEN.Easing.Exponential.InOut)
.onUpdate(function () {
window.scrollTo(0, this.y);
})
.start();
animate();
以上示例来自https://github.com/tweenjs/tween.js/blob/master/examples/00_hello_world.html。