threejs/tween.js中如何让物体一步步移动

How to make a object move step by step in threejs/tween.js

我想让我的圆柱体(代码中的介子)逐个移动到我创建的板上的对象。 我有这个代码:

a : 开始
索引:对象

attachEvent(_this, index,a) {
if(index>=a){

_this.domEvents.addEventListener(_this.cases[index], 'click',        
function(event) {
for ( var i = a; i <= index; i++) {
  _this.stepByStep(_this,i)
}
}, false)
}else{

_this.domEvents.addEventListener(_this.cases[index], 'click',        
function(event) {
//nothing now
}, false)
}

}

stepByStep(_this,i)
{
_this.tween = new TWEEN.Tween(this.pions.position)
        .to({
        x:  _this.cases[i].position.x,
        y: _this.cases[i].position.y,
        z: 5},1000)
        .start();
}

当我 运行 我的代码时,我不知道为什么,但介子直接进入了对象。

我不是 Tween.js 用户(TweenJS 在这里!),但我怀疑它的用法相同。

您在每次迭代的 for 循环中创建新补间,而不是附加新位置。它基本上是创建一堆同时开始并 运行 并发的独立补间,但都影响同一个对象。很有可能最后一个补间被应用。

编辑 显然这是 how Tween.js works? Only a single to() call can be used for a tween. My original solution works for TweenJS,但不是 Tween.js,您的示例使用的是:

原始解决方案仅适用于 CREATEJS/TWEENJS:

创建 Tween 一次,并在循环中追加 to() 次调用:

var tween = new createjs.Tween(this.pions.position);
for ( var i = a; i <= index; i++) {
  _this.stepByStep(tween, _this.cases[i].position); // Arguments changed!
}

function stepByStep(tween, position)
{
    tween.to({
        x: position.x,
        y: position.y,
        z: 5
    }, 1000);
}

这会生成一个补间,并为每个位置添加 to() 次调用。我也稍微简化了参数以使函数更简洁(传递整个范围有点混乱)。你可以随心所欲地清理它。


更新的解决方案

使用Tween.js,似乎有必要为每个新动画创建一个新的补间,但不是一次性创建它们,而是必须chain,并且只开始第一个补间。

这是一些伪代码:

var firstTween = new Tween.Tween(obj)
var earlierTween = firstTween;
(loop) {
  var tween = new TWEEN.Tween(obj);
  tween.to({params});
  earlierTween.chain(tween);
  earlierTween = tween;
}
firstTween.start();

这是我快速整理的 fiddle。绘图层使用EaselJS,但补间使用Tween.js。 https://jsfiddle.net/0mh6kj5y/8/

我还注意到您在函数中引用了 this.pions,而其他所有内容都使用 _this 作为范围。

希望对您有所帮助!