即使在三个js中发生物质变化后,仍保留phongness



我尝试加载我的 .obj.mtl文件,现在我试图在键盘上更改对象的材料,我可以使用纹理图像按预期进行更改。但是,当我想使用或不带有纹理图像的phong效果更改材料时,它不会发生。

//当我在键盘上使用基本纹理图像

上时,此方法正常工作
var texture1 = THREE.ImageUtils.loadTexture("neavik/9.jpg");
var texture2 = THREE.ImageUtils.loadTexture("neavik/10.jpg");
if (child.material.name == "meta") {
child.material.map = texture1;
child.material.needsUpdate = true;
child.receiveShadow = true;

var index = 0;
var onKeyDown = function(event) {
    if (event.keyCode == 67) { // when 'c' is pressed
        object.traverse(function(child) {
                if (child instanceof THREE.Mesh) {
                    var colors = [texture2, texture1];
                    if (child.material.name == "meta") {
                        if (index == colors.length) index = 0;
                        child.material.map = colors[index++];
                        child.material.needsUpdate = true;
                        child.geometry.buffersNeedUpdate = true;
                        child.geometry.uvsNeedUpdate = true;
                    }
                }
            }
        };
        document.addEventListener('keyup', onKeyDown, true);
    });

//现在,如果我尝试更改与phong相同效果的材料,它不会反映出按键的任何更改。[也没有错误]

var texture1 = THREE.ImageUtils.loadTexture("neavik/9.jpg");
var texture2 = THREE.ImageUtils.loadTexture("neavik/10.jpg");
var cleana = new THREE.MeshPhongMaterial({
    map: texture1,
    color: 0xffffef,
    specular: 0x000000,
    combine: THREE.AddOperation,
    reflectivity: 0
})
var cleanb = new THREE.MeshPhongMaterial({
    map: texture2,
    color: 0xffffef,
    specular: 0x000000,
    combine: THREE.AddOperation,
    reflectivity: 0
})
if (child.material.name == "meta") {
    child.material = cleana;
    child.material.needsUpdate = true;
    child.receiveShadow = true;

    var index = 0;
    var onKeyDown = function(event) {
        if (event.keyCode == 67) { // when 'c' is pressed
            object.traverse(function(child) {
                    if (child instanceof THREE.Mesh) {
                        var colors = [cleana, cleanb];
                        if (child.material.name == "meta") {
                            if (index == colors.length) index = 0;
                            child.material = colors[index++];
                            child.material.needsUpdate = true;
                            child.geometry.buffersNeedUpdate = true;
                            child.geometry.uvsNeedUpdate = true;
                        }
                    }
                }
            };
            document.addEventListener('keyup', onKeyDown, true);
        });

请让我知道是否有其他方法。

如果要交换需要做的整个材料:

child.material = cleana;

child.material = cleanb;

,然后您很可能必须做:

child.material.needsUpdate = true;

阅读有关如何更新此中如何更新内容参考页面材料

中的参考页面的更多信息。

更新

因此,如果要使用数组设置:

var materials = [cleana, cleanb];
child.material = materials[0]; // cleana

child.material = materials[1]; // cleanb

,然后最有可能:

child.material.needsUpdate = true;

它可以与一系列材料一起工作。您甚至不需要设置material.needsUpdate = true。此小提琴中的演示。

相关内容

  • 没有找到相关文章

最新更新