【问题标题】:not able change textures on click threejs无法更改点击threejs的纹理
【发布时间】:2016-06-10 02:51:47
【问题描述】:

我正在尝试通过单击更改对象的纹理/颜色(通过单击单独的立方体)

我只能更改对象的颜色一次(即使我使用了 for-loop )并且前提是对象上没有以前的纹理或颜色。 但是,如果对象已经具有现有颜色,我将无法更改颜色。 我需要添加一些需求更新吗?我做了,但没有运气.. 请看看我的 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;
                }
            }
        })
    }
});

请让我知道我哪里出错了。谢谢。

//重试但可以设法使用以下代码仅更改一种颜色,我认为我以错误的方式使用了需求更新。

                    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;
                            } }
                     })

【问题讨论】:

  • 材质不等于颜色?你试过material.color,但它应该是正确的颜色格式,比如0xff0000
  • var White = new THREE.MeshPhongMaterial({ color:0xffffef, combine: THREE.MultiplyOperation, reflectivity:0.4 }) 我已经像这样全局定义了颜色,我尝试使用 material.color = colors[i ],但点击时对象消失
  • 您似乎正在将颜色设置为字符串,请尝试使用方法:.setHex(0xff0000);请参阅此示例 - jsfiddle.net/Lfr5my2s/11
  • 他的问题可能是他试图在闭包中引用i

标签: javascript three.js


【解决方案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

【讨论】:

  • 尼尔,我可以做到这一点,但我的要求是我需要将选定的颜色/纹理存储在一个数组中,以便我可以相应地在点击时使用它们。
  • @andyram 我没有看到问题,请查看更新的答案和小提琴
  • 我用小提琴参考重试了它,我可以设法拉入第一个数组颜色,但不是全部,这是一个需要更新的问题吗?我已经更新了上面的代码。
猜你喜欢
  • 1970-01-01
  • 2020-04-11
  • 2016-05-03
  • 2015-05-25
  • 1970-01-01
  • 2014-09-26
  • 2021-11-03
  • 2013-03-09
  • 1970-01-01
相关资源
最近更新 更多