Как можно изменить текущую текстуру (установил программно) у 3d объекта, используя textureObjLoader
?
textureObjLoader = new THREE.TextureLoader(),
map = textureObjLoader.load(`./models/${allTextures[i][0]}`);
material = new THREE.MeshPhongMaterial({map: map});
objLoader = new THREE.OBJLoader();
objLoader.load(`./models/${objects[i]}`, function (obj) {
obj.traverse( node=>{if (node.isMesh) node.material = material});
obj.name = names[i];
scene.add(obj);
});
Чтобы изменить текстуру y THREE.MeshPhongMaterial
достаточно изменить параметр map
и поставить флаг needsUpdate
у уже существующего материала
material.map = texture;
material.needsUpdate = true;
Однако загрузка текстуры - асинхронная операция, и по этому выставлять эти параметры необходимо после загрузки изображения, в случае когда оно еще не загружено.
Я поправил функцию из Вашего примера и теперь при нажатии на круги у банана меняется текстура.
Вторым аргументом у метода load()
в textureLoader
идет колбек загрузки текстуры, я поместил в него код, который не создает новый материал и только меняю текстуру в уже существующем.
function changeTexture(i) {
let colorBlocks = document.querySelectorAll('.color_scheme__block');
colorBlocks.forEach((val) => {
val.onclick = () => {
let value= val.style.background,
arr = value.split('/'),
result=arr[arr.length-1].slice(0,-2);
textureObjLoader.load(`./models/${result}`, function(texture){
var mat = scene.getObjectByName( names[i], true).children[0].material;
mat.map = texture;
mat.needsUpdate = true;
});
};
});
}
использование .children[0]
в общем случае некорректно, однако я не стал с этим мудрить, по хорошему надо проехаться по всем мешам в объекте в поисках необходимого материала, т.к. в общем же случае материалы могут быть у отдельных объектов в модели разные и не одни. но это лирика, для Вашего примера код работает корректно
Так же может быть не оптимально каждый раз создавать новые текстуры при клике на кнопку, но тут палка о двух концах, все зависит от количества и размера текстур и от характера их использования в приложении (как часто они меняются итд)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Что есть Набор данных в виде: Тема пиьма – Имя / комментарий, наборов может быть несколько, выполняется split по \n
пытался через js добавить атрибут 'muted' к аудио тегу, но попытки тщетныПри просмотре элементов все работает, но на деле же музыка продолжает...