Итак, у меня есть экспорт Collada (dae) из приложения 3D-модели для создания упаковки.
Мне удалось импортировать эту модель в мою сцену с помощью
var loader = new THREE.ColladaLoader();
loader.load("model.dae", collada => {
this.scene.add(collada.dae);
});
Это работает. Анимации тоже работают.
Однако в этом файле dae есть ссылки на внешние текстуры. И я хочу программно заменить некоторые из них.
Деа из экспорта использует ShaderMaterial
элементов и я понятия не имею применить к нему новую текстуру. Все, что я делаю, сделает его черным или ничего не сделает.
Что я пробовал
Я знаю имя используемой текстуры изображения, которую я хочу заменить. Имя TextureResource129.png
.
Итак, что я делаю:
- Загрузите новую текстуру
- Перебрать все узлы/дети в
dea
, которые есть в сцене. - Я проверяю, есть ли у узла
material object
иis a mesh
- Я клонирую материал
- Я заменяю старое изображение текстуры в дереве объектов новым изображением текстуры. Экспорт имеет их в 4 возможных местах.
- Затем я снова добавляю скорректированный материал.
- Затем объект становится черным в сцене
Код:
var loader = new THREE.TextureLoader();
loader.load("/assets/images/texture2/TextureResource129.png", texture => {
this.dae.traverse(node => {
if (node.material && node.isMesh) {
if (
node.material.uniforms.EnvDiff0 &&
node.material.uniforms.EnvDiff0.value.image.currentSrc.indexOf("TextureResource129.png") > -1 ||
node.material.uniforms.paperBump1 &&
node.material.uniforms.paperBump1.value.image.currentSrc.indexOf("TextureResource129.png") > -1 ||
node.material.uniforms.matDiff1 &&
node.material.uniforms.matDiff1.value.image.currentSrc.indexOf("TextureResource129.png") > -1 ||
node.material.uniforms.matDiff2 &&
node.material.uniforms.matDiff2.value.image.currentSrc.indexOf("TextureResource129.png") > -1
) {
var material = node.material.clone();
if(material.uniforms.EnvDiff0) material.uniforms.EnvDiff0.image = texture;
if(material.uniforms.paperBump1) material.uniforms.paperBump1.image = texture;
if(material.uniforms.matDiff1) material.uniforms.matDiff1.image = texture;
if(material.uniforms.matDiff2) material.uniforms.matDiff2.image = texture;
node.material = material;
}
}
});
});
Это делает объект черным. Итак I tried only cloning the material and attaching it again to the same node
, без изменений. Но и тогда оно снова чернеет:
var loader = new THREE.TextureLoader();
loader.load("/assets/images/texture2/TextureResource129.png", texture => {
this.dae.traverse(node => {
if (node.material && node.isMesh) {
if (
node.material.uniforms.EnvDiff0 &&
node.material.uniforms.EnvDiff0.value.image.currentSrc.indexOf("TextureResource129.png") > -1 ||
node.material.uniforms.paperBump1 &&
node.material.uniforms.paperBump1.value.image.currentSrc.indexOf("TextureResource129.png") > -1 ||
node.material.uniforms.matDiff1 &&
node.material.uniforms.matDiff1.value.image.currentSrc.indexOf("TextureResource129.png") > -1 ||
node.material.uniforms.matDiff2 &&
node.material.uniforms.matDiff2.value.image.currentSrc.indexOf("TextureResource129.png") > -1
) {
var material = node.material.clone();
node.material = material;
}
}
});
});
Итак, вопрос:
Как программно изменить текстуру файла коллады (.dea), когда он находится в сцене?
collada.scene
содержит сцену, а неcollada.dae
. Если я что-то упускаю, пожалуйста, не обращайте внимания. - person ScieCode   schedule 05.06.2019Material.needsUpdate
наtrue
, см. stackoverflow.com/questions/16066448/ - person Mugen87   schedule 05.06.2019