三个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;
});
我正在尝试使用 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; });