如何使用 Three.js 和 Collada Loader 更新 .dae 文件中模型的特定部分

Posted

技术标签:

【中文标题】如何使用 Three.js 和 Collada Loader 更新 .dae 文件中模型的特定部分【英文标题】:How to update particular part of a model in .dae file using Three.js and Collada Loader 【发布时间】:2019-03-20 18:24:11 【问题描述】:

我在example中使用了three.js提供的一个Elf Girl模型的例子 这是我正在使用的链接ELF GIRL

我想更新这张图片 CE2 image 而不是这个CE image

【问题讨论】:

为什么不在加载DAE 之前更改原始纹理?如果由于某些原因想要保留原始纹理,可以打开DAE 并查找<init_from>ce.jpg</init_from> 行。您可以在此处更改纹理名称,以便 ColladaLoader 加载不同的文件。 我希望它在按钮单击时在运行时替换。 【参考方案1】:

用途:

var yourObject;
modelOrScene.traverse( (obj)=>
  if(obj.material && obj.material.map)
      console.log(obj.name) //print all object names, and material map image paths..
  if(obj.name == 'NameOfTheObjectWithTheTexture")
      yourObject = obj;
)

在您的模型上查找具有纹理贴图的对象和材质的名称。

一旦您知道哪个对象具有该材质+贴图,您就可以使用加载新纹理

   if(yourObject)
      new THREE.TextureLoader().load( "yourOtherImage.png" ,(tex)=>
       yourObject.material.map  = tex;  //Replace the objects material once the new material is loaded.
    )

【讨论】:

我收到错误,因为无法读取 (obj.material.map.img.src) 处未定义的属性“src”。 这是我尝试过的,它向我显示了同样的错误。 $("#img_changer").click(function() scene.traverse((obj) => if (obj.material && obj.material.map) console.log(obj.name, obj.material[0] .map.img.src) //打印所有对象名称,以及材质贴图图像路径.. /* if (obj.name == 'NameOfTheObjectWithTheTexture") yourObject = obj;*/ ) ); 对不起.. 更新了我的答案.. 我认为是 .image 而不是 .img 错误存在,但如果我替换 console.log(obj.name,obj.material[0].map.image.src);这不是我认为的正确方式。它只针对第一张图片 我正在尝试向您展示如何使用 .traverse 检查场景中的所有节点...尝试一下: console.log(obj.name) 这将告诉您对象名称。 .

以上是关于如何使用 Three.js 和 Collada Loader 更新 .dae 文件中模型的特定部分的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Three.js 和 Collada Loader 更新 .dae 文件中模型的特定部分

更改 Three.js collada 对象的纹理和颜色

如何在 Three.js 中用 ShaderMaterial 替换 Collada 导入的纹理?

如何在 Three.js 中克隆包含多个网格的 Collada 对象

如何将 collada 对象加载到 three.js?

Three.js - 从文件输入加载 Collada 文件(和纹理)