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

Can Three JS colladaLoader load ZAE files?

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

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

Uncaught TypeError: Cannot read property 'getAttribute' of undefined

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

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

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

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

但是从浏览 collada specification(第 20 页)来看,应该可以编写一个基于(或使用)可以处理 zae-files 的 ColladaLoader 的加载程序。

像这样:

  • 加载文件并解压(其他加载程序正在使用JSZip for that, for example the THREE.KMZLoader
  • 从存档中解析 manifest.xml 以从 <dae_root> 元素中获取主 .dae 文件名。
  • 使用正常的 THREE.ColladaLoader
  • 解析 .dae-file
  • 加载程序将尝试直接加载纹理(使用 textureLoader.load()),因此您需要向 ColladaLoader 提供 THREE.LoadingManager 可以从 return 图像存档。这可以通过向 LoadingManager 指定一个 'url-modifier' 函数来完成:

    • 检查 url 是否与存档中的文件匹配
    • 将文件从存档中提取到 Blob 实例中
    • return 已解决 URL 的 blob object-url(参见 URL.createObjectUrl())。 例如:

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