Сохранение Phongness даже после материального изменения в three.js

Я пытался загрузить мой .obj а также .mtl файлы, и теперь я пытаюсь изменить материал объекта при нажатии клавиш, я могу внести изменения, как и ожидалось, с использованием текстур изображений. Однако, когда я хочу изменить материалы, используя эффект фонга с изображением текстуры или без него, этого не происходит.

// ЭТОТ МЕТОД РАБОТАЕТ ОТЛИЧНО, КОГДА Я ИСПОЛЬЗУЮ ОСНОВНЫЕ ИЗОБРАЖЕНИЯ ТЕКСТУРЫ НА KEYPRESS

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

        });

Пожалуйста, дайте мне знать, если есть другой способ сделать это.

1 ответ

Если вы хотите обменять весь материал, который вам нужно сделать:

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, Демонстрация здесь, в этой скрипке.

Другие вопросы по тегам