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