Theejs-使用ShaderMaterial

时间:2019-06-05 14:22:46

标签: three.js collada shadermaterial

因此,我从3d模型应用程序中导出了Collada(dae)以创建包装。

我已经成功地在场景中导入了该模型

var loader = new THREE.ColladaLoader();
   loader.load("model.dae", collada => {

   this.scene.add(collada.dae);
});

这有效。动画也可以。

但是,此dae文件具有对外部纹理的一些引用。我想以编程方式替换其中一些。

导出的dea使用ShaderMaterial元素,我不知道对其应用新的纹理。我所做的一切都会使其变黑或什么都不做。

我尝试过的事情

我知道要替换的蜜蜂图像纹理的名称。名称为TextureResource129.png

那我该怎么办

  • 加载新纹理
  • 遍历场景中dea中的所有节点/子节点。
  • 我检查节点是否具有material objectis 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;
      }
    }
  });
});

所以问题是:

如何在场景中以编程方式更改collada(.dea)文件的纹理?

0 个答案:

没有答案