2016-03-09 50 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

爲每個克隆創建一個新變量並不是我最好的選擇,我使用了閉包來使其工作。我很困惑這個函數可能會在數組中被壓入時被正確執行。 無論如何..使用封閉工作像一個魅力。 –