2016-06-09 90 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

我重试它的小提琴引用,我可以设法拉入第一个数组的颜色,但不是全部,这是一个需要更新的问题吗?我已经更新了上面的代码。 –