DRACOLoader
有时在开发过程中,需要引入一些很大的模型,如果不做任何处理性能会很低,
可以在使用Blender导出模型时进行压缩:
右侧菜单栏/Data/Compression
压缩过的模型在threeJs中加载时,不能直接使用GLTFLoader进行加载,
如果直接使用GLTFLoader加载Draco压缩模型,会报错:
1 | No DRACOLoader instance provided. |
需要引入另一个压缩模型的加载器:DRACOLoader,
用到DRACOLoader时,遇到了不少坑
坑1:DRACOLoader加载模型必须经过draco压缩
如果加载未经过draco压缩的模型,会报错,
我原本理解错误,以为对模型压缩的步骤是在Loader过程中实现的,
实际上压缩模型需要在Blender里面完成,
DRACOLoader只是针对压缩模型的一个加载器。
坑2:解析文件路径配置
网上有不少地方说配置路径可以通过复制draco git仓库的readme文档中提供的url实现:
1 | dLoader.setDecoderPath('https://www.gstatic.com/draco/versioned/decoders/1.5.7/') |
一开始我也是这么配置的,但是比较了一下模型的加载速度,
好像没有多大变化,我以为是路径配置错误,
于是就开始下面一错再错的痛苦经历:
threejs中的DRACOLoader类要解析压缩模型需要几个关键解析文件:
- draco_decoder.js Emscripten-compiled decoder
- draco_decoder.wasm WebAssembly decoder
- draco_wasm_wrapper.js JavaScript wrapper
好的我已经看不懂了,反正三个都是解码器。
总之DRACOLoader的decoderPath解码路径只要指向这三个文件就行了,
在包管理器中,这三个文件目录如下:
three/examples/jsm/libs/draco/
那是不是把解码器路径配置成上面这个就行了?
1 | dLoader.setDecoderPath('/examples/jsm/libs/draco/') |
还是报错:
Uncaught SyntaxError: Unexpected token ‘<’ (at f11573a6-dd88-4e61-930c-e24ebf877308:2:1)
报的是语法错误,说明解析有问题,解析文件没有获取到。
在网上翻到了这篇博文:
把刚才的draco文件移动到public文件夹,在浏览器端运行时可以获取到,draco模型正常加载:
1 | const loader = new GLTFLoader() |
