三JS colladaLoader 可以加载ZAE文件吗?

Posted

技术标签:

【中文标题】三JS colladaLoader 可以加载ZAE文件吗?【英文标题】:Can Three JS colladaLoader load ZAE files? 【发布时间】:2018-07-23 21:48:49 【问题描述】:

我正在尝试使用 ThreeJS 来加载 collada 文件,并且我已经在他们的演示部分复制了代码。它似乎可以很好地加载 .dae 文件,即使它们在其他文件中有纹理。不幸的是,我需要加载一个包含纹理的文件。

看起来 .zae 文件是前进的方向,但是当我尝试加载一个时,我得到一个空白屏幕和一个控制台错误:

Uncaught TypeError: Cannot read property 'getAttribute' of undefined

调试器显示它发生在 colladaLoader.js 包中的以下行

var version = collada.getAttribute( 'version' );

这是因为 .zae 文件不受支持还是我做错了什么?

【问题讨论】:

您有示例 .zae 文件吗?从我最初的研究来看,.zae 文件似乎只是 zip 档案,但我不确定它们包含哪些文件。 【参考方案1】:

不,默认的 ColladaLoader 不能这样做。

但是从collada specification(第20页)看一眼,应该可以编写一个基于(或使用)可以处理zae文件的ColladaLoader的加载器。

类似这样的:

加载文件并解压(其他加载器使用JSZip,例如THREE.KMZLoader) 解析存档中的manifest.xml 以从<dae_root> 元素中获取主.dae 文件名。 使用普通的THREE.ColladaLoader解析那个.dae文件

加载器将尝试直接加载纹理(使用textureLoader.load()),因此您需要向可以从存档返回图像的ColladaLoader 提供THREE.LoadingManager。这可以通过向 LoadingManager 指定一个“url-modifier”函数来完成:

检查 url 是否与存档中的文件匹配 将文件从存档中提取到Blob 实例中

将 blob 的 object-url 作为已解析的 URL 返回(请参阅URL.createObjectUrl())。 比如:

THREE.DefaultLoadingManager.setURLModifier(url => 
  if (existsInArchive(url)) 
    return URL.createObjectUrl(new Blob([getFromArchive(url)]));
  

  return url;
);

【讨论】:

不客气!如果您确实构建了它,请考虑提出拉取请求 :)

以上是关于三JS colladaLoader 可以加载ZAE文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Three.js 中的 ColladaLoader.js 无法加载我的文件?

三.js ColladaLoader 源文件的位置

three.js 图像纹理渲染为颜色(使用 ColladaLoader 加载)

ColladaLoader2.js - 随机颜色覆盖 .dae 文件设置 (three.js)

ColladaLoader TypeError: THREE.LoaderUtils 未定义

Mr.Doob在github的examples文件夹中给出的ColladaLoader.js和ColladaLoader2.js有啥区别?