javascript - 如何在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();
}
当我运行我的代码时,我不知道为什么,但是 pions 直接进入了对象。
解决方案
我不是 Tween.js 用户(这里是TweenJS!),但我怀疑它的用法相同。
每次迭代都在 for 循环中创建新的补间,而不是附加新的位置。它基本上是创建一堆同时开始并同时运行的独立补间,但都影响同一个对象。最后一个补间是被应用的机会很好。
编辑 显然这就是Tween.js 的工作原理?只有一个 to() 调用可以用于补间。我的原始解决方案适用于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();
这是我拼凑的一个快速小提琴。绘图层使用 EaselJS,但补间使用的是 Tween.js。 https://jsfiddle.net/0mh6kj5y/8/
我还注意到您this.pions
在函数中提到了,而其他所有内容都_this
用于范围。
希望有帮助!
推荐阅读
- boolean-algebra - 需要帮助理解布尔表达式
- excel - 在任何行插入新行后自动填充公式(此工作簿或工作表的 VBA,而不是宏模块按钮)
- ios - 找到合适的图像;代码 13.3
- azure-devops - Azure DevOps On-Premise - 如何停止和删除远程计算机上的 Windows 服务?
- css - 在页面上垂直和水平居中表格
- r - 删除 R 中低于某个阈值的所有行
- docker - 如何通过物理网卡到 Docker 容器?
- android - 无法在 Mac OS X 上启动 android 模拟器,失败并显示找不到图像错误
- java - 使用 Hibernate 获取表中的所有数据
- android - 膨胀第二个导航主机时应用程序崩溃