2016-06-09 89 views
1

我試圖改變對象的紋理/顏色的onclick(通過點擊不同的立方體)無法改變紋理threejs

我能夠改變物體的顏色只有一次(儘管我使用for-loop),並假定對象上沒有先前的紋理或顏色。 但是,如果對象已具有現有顏色,則無法更改顏色。 我需要添加一些needsUpdate嗎?我做了但沒有運氣..請看看我的onclick功能。

EventsControls.attachEvent('onclick', function() { 
    var colors = ['White', 'blue', 'gold']; 
    for (var i = 0; i < colors.length; i++) { 
     object.traverse(function(child) { 
      if (child instanceof THREE.Mesh) { 
       if (child.material.name == "Sofa_Leather") { 
        child.material = colors[i]; // array elements are already defined 
        child.material.needsUpdate = true; 
        child.material.buffersNeedUpdate = true; 
        child.material.uvsNeedUpdate = true; 
        child.receiveShadow = true; 
       } 
      } 
     }) 
    } 
}); 

請讓我知道哪裏出錯了。謝謝。

//重試,但可以設法改變只有一個顏色與下面的代碼,我想即時通過使用needsUpdate錯誤的方式。

    var index=0;  
        var colors=[0xfffeef,0xffff00,0x000fff]; 

        object.traverse(function(child) { if (child instanceof THREE.Mesh) { 

        if (child.material.name == "Sofa_Leather") { 

           if(index == colors.length) index = 0; 
           child.material.color.setHex(colors[index++]); 

           child.material.needsUpdate = true; 
           child.receiveShadow = true; 
          } } 
        }) 
+0

材料不等於一種顏色嗎?您是否嘗試過'material.color',但它應該使用正確的顏色格式,如「0xff0000」。 –

+0

VAR白色=新THREE.MeshPhongMaterial({ \t顏色:0xffffef, \t結合:THREE.MultiplyOperation, \t反射率:0.4 })全局這樣 我已定義的顏色,我試圖使用material.color =顏色[ i],但對象在點擊時消失 –

+0

您似乎將顏色設置爲字符串,請嘗試使用以下方法:.setHex(0xff0000);看到這個例子 - http://jsfiddle.net/Lfr5my2s/11/ – Neil

回答

1

我相信你可以通過這樣做:

material.color.setHex(0xffffff * Math.random()); // set to random color 

編輯:

好耶相信你也可以做到這一點:

var colors = [0xff0000, 0x00ff00, 0x0000ff]; // red, green and blue 
if(index == colors.length) index = 0; 
line.material.color.setHex(colors[index++]); 

看到這個更新了jsfiddle

+0

尼爾,即時能夠做到這一點,但我的要求是我需要選擇存儲在數組中的顏色/紋理,以便我可以相應地使用它們onclick。 –

+0

@andyram我沒有看到問題,看到更新的答案和小提琴 – Neil

+0

我重試它的小提琴引用,我可以設法拉入第一個數組的顏色,但不是全部,這是一個需要更新的問題嗎?我已經更新了上面的代碼。 –