【问题标题】:Can Three JS colladaLoader load ZAE files?三JS colladaLoader 可以加载ZAE文件吗?
【发布时间】: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 档案,但我不确定它们包含哪些文件。

标签: javascript three.js collada


【解决方案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;
      });
      

【讨论】:

  • 不客气!如果您确实构建了它,请考虑提出拉取请求 :)
猜你喜欢
  • 2012-07-29
  • 2013-02-02
  • 2015-01-31
  • 1970-01-01
  • 2013-05-19
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多