在keypress three.js上更改对象材质的问题

时间:2016-06-22 06:03:42

标签: javascript three.js

我正在尝试在按下按键时将存储在数组中的颜色应用于我的对象,但由于某种原因,我只能在按下时获取数组的第一个元素。如果还有其他办法,请告诉我。

我尝试了随机颜色功能,但我的要求不包括随机应用颜色。

 var onKeyDown = function(event) {

    if (event.keyCode == 67) { // when 'c' is pressed
                                 var index=0;    

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

                                        if (child.material.name == "Leather")  {
                                           var colors = [0xff0000, 0x00ff00, 0x0000ff]; // red, green and blue
                                            if(index == colors.length) index = 0;
                                            child.material.color.setHex(colors[index++]);
                                            child.material.needsUpdate=true;
                                            child.geometry.buffersNeedUpdate = true;
                                            child.geometry.uvsNeedUpdate = true;

                                        }
                                        }});

                            } };
                                document.addEventListener('keydown', onKeyDown, true);

1 个答案:

答案 0 :(得分:1)

您的变量'索引'位于函数的本地范围内。所以当你按下C键时,它会被初始化(var index = 0;)。

你只需要将这个变量移到函数之外,一切都会好的。

var index=0,
onKeyDown = function(event) {
    if (event.keyCode == 67) { // when 'c' is pressed
        object.traverse( function(child) { 
            if (child instanceof THREE.Mesh) {
                if (child.material.name == "Leather")  {
                    var colors = [0xff0000, 0x00ff00, 0x0000ff]; // red, green and blue
                    if(index == colors.length) index = 0;
                    child.material.color.setHex(colors[index++]);
                    child.material.needsUpdate=true;
                    child.geometry.buffersNeedUpdate = true;
                    child.geometry.uvsNeedUpdate = true;
                }
             }
        });
    }
};

document.addEventListener('keydown', onKeyDown, true);