Theejs — изменение текстуры элемента коллады с использованием ShaderMaterial

Итак, у меня есть экспорт 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), когда он находится в сцене?


person NLAnaconda    schedule 05.06.2019    source источник
comment
Используете ли вы последнюю версию ColladaLoader? ? Я не вижу упоминаний о ShaderMaterial во всем загрузчике, также я уверен, что collada.scene содержит сцену, а не collada.dae. Если я что-то упускаю, пожалуйста, не обращайте внимания.   -  person ScieCode    schedule 05.06.2019
comment
Если вы заменяете текстуру материала, вам также необходимо установить Material.needsUpdate на true, см. stackoverflow.com/questions/16066448/   -  person Mugen87    schedule 05.06.2019