2016-03-09 47 views
0

最近我一直在使用ThreeJS模型。 我设法实现了一次加载每个需要的.obj的自定义函数,如果有更多的对象使用相同的模型,请克隆它们而不是再次加载它们。三个js动画克隆网格

问题是我需要以特定的方式为每个克隆网格设置动画。

我创建了一个对象数组,其中包含每个需要动画的网格的函数,这些函数将在需要时循环并执行。问题是,只有第一个模型实际上是由于某种原因被动画的。

下面是我用于动画网格的代码。

function loadModel(m){ 
    for(var i = 0; i<objects.length; i++){ 
     if(m.name === objects[i].modelData.model){ 
      mesh = m.mesh.clone(); 
      mesh.position.x = objects[i].positionX * distanceAmplifier; 
      mesh.position.y = objects[i].positionY * distanceAmplifier; 
      mesh.position.z = objects[i].positionZ * distanceAmplifier; 
      mesh.scale.set(1000,1000,1000); 
      //Adding animation 
      animations.push(function(){ 
       mesh.rotation.z += 1.0005; 
      }); 
      scene.add(mesh); 
     } 
    } 
} 

虽然在动漫我这样做:

if(animations.length === objects.length){ 
     animations.map(function(anim){ 
      anim(); 
     }); 
} 

如果我加载不同的OBJ网格,他们每个人的第一个实例被动画,而不是克隆本身。

我希望有人谁有同样的问题可以给我一只手在整理了这一点

回答

1

看起来像一个范围问题给我。我认为这不是你的克隆第一实例正在动画,而是最后

这里检查你的代码:

animations.push(function(){ 
    mesh.rotation.z += 1.0005; 
}); 

你在做什么是推动匿名函数成阵列。但是这个函数在被推入时不会立即执行,它只是坐在等待被调用的地方。当它最终被执行时,mesh很久以前就从当你将该函数推入数组时的任何事情发展而来。由于您在循环范围外声明mesh变量,因此您对mesh的每个引用都指向完全相同的变量。

有两种方法可以解决这个问题。一个简单的方法是创建你的循环每次迭代新mesh变量,而不是无谓地引用一个变量,它是你的当前范围之外:

var newMesh = m.mesh.clone(); // declare a brand new var instead of reusing 'mesh' 
... 
animations.push(function(){ 
    newMesh.rotation.z += 1.0005; 
}); 

如果你有某种疯狂的原因,实际使用mesh内你的循环的范围,你可以在执行for循环时“关闭”它的值,而不是让它在稍后停止。这就是所谓的“封闭”是重要的事情在JavaScript理解:

// Create an anonymous function and pass it 'mesh' 
// Then execute it immediately to capture the current 'mesh' value 
(function(_mesh){ 
    animations.push(function(){ 
     _mesh.rotation.z += 1.0005; 
    }); 
})(mesh); 

注意怎么现在的匿名功能不仅创造,但它立即执行,并通过了mesh变量捕捉到它的价值与此同时。

(function(){console.log("Hello.");})(); // this is executed immediately! 

这有一个名称:“立即调用函数表达式”。这正是它听起来像 - 声明一个函数,然后立即执行它。这是创建闭包的常用方法。

我建议你做的范围和封锁在JavaScript中是如何工作的一些阅读:

What is the scope of variables in JavaScript?

How do JavaScript closures work?

祝你好运!

+0

为每个克隆创建一个新变量并不是我最好的选择,我使用了闭包来使其工作。我很困惑这个函数可能会在数组中被压入时被正确执行。 无论如何..使用封闭工作像一个魅力。 –