【发布时间】:2017-04-12 07:35:32
【问题描述】:
我正在尝试在 setInterval 上生成一组对象,并在路径上为每个对象提供自己的动画(目前使用 requestAnimationFrame 来执行此操作)。我设法添加了一个对象并在路径上对其进行动画处理。使用此代码:
var psGeometry = new THREE.PlaneGeometry(3,2,10,1);
var psPlane = new THREE.Mesh(psGeometry, new THREE.MeshBasicMaterial({color:0x0000ff}));
scene.add(psPlane);
function animatePaper(obj = psPlane, offset= 0.007)
{
if(counter <=( 1-obj.geometry.vertices.length/2 *offset))
{
for (var i=0; i < obj.geometry.vertices.length/2; i++)
{
obj.geometry.vertices[i].y = curvePath.getPoint(counter + i * offset).y;
obj.geometry.vertices[i].z = -0.5;
obj.geometry.vertices[i + obj.geometry.vertices.length/2].y = curvePath.getPoint(counter + i * offset).y;
obj.geometry.vertices[i + obj.geometry.vertices.length/2].z = -2.5;
obj.geometry.vertices[i].x = curvePath.getPoint(counter + i * offset).x;
obj.geometry.vertices[i + obj.geometry.vertices.length/2].x = curvePath.getPoint(counter + i * offset).x;
}
obj.geometry.verticesNeedUpdate = true;
counter += 0.005;
}
else{
console.log("Removing...");
scene.remove(obj);
}
}
function animate() {
requestAnimationFrame(animate);
animatePaper(psPlane, 0.007);
render();
}
可在此处找到示例:jsfiddle.net。
由于这会沿曲线路径为对象设置动画(请参见 jsfiddle 示例),我认为按间隔生成这些对象并应用上述代码应该可以工作。错了!
我尝试过:创建一个生成对象的函数并应用上面的代码:
setInterval(drawSheets, 1000);
function drawSheets()
{
var psGeometry = new THREE.PlaneGeometry(3,2,10,1);
var psPlane = new THREE.Mesh(psGeometry, new THREE.MeshBasicMaterial({color:0x0000ff}));
scene.add(psPlane);
setInterval(function(){animatePaper(psPlane, 0.007);}, 30);
}
我也在this answer的基础上试过:
setInterval(objArray.forEach(function(obj){setInterval(function(){animatePaper(obj);},300);}), 3000);
预期: 在一定间隔内生成多个对象,并在曲线上分别为每个对象设置动画。
希望任何人都可以帮助我!干杯。
版本:Three.js r82
** 编辑:** 小改进。经过另一个小测试(jsfiddle)。我发现当我在函数上使用 setInterval 时,它共享相同的变量(从而加快动画速度)。由于这是问题的一部分,我想问一下是否有人知道如何使这些变量成为对象的本地变量。
【问题讨论】:
标签: javascript animation 3d three.js curve