GLTF2Loader 中的当前模式如下所示:
class GLTF2Parser {
loadMeshes () {
return this._withDependencies( [
'materials',
'accessors'
] ).then( ( dependencies ) => {
_each( json.meshes, ( meshDef ) => {
var geometry = /* ... */;
var material = dependencies.materials[ meshDef.material ];
var mesh = new THREE.Mesh( geometry, material );
// ...
return mesh;
} );
// ...
return meshes;
} );
}
// ...
}
因此,所有访问器(依次依赖于所有.bin
缓冲区文件)将在创建任何网格之前加载。 这引入了一个问题,如果不是所有的缓冲区实际上都需要的话。 例如:
.bin
文件和一个未压缩的.bin
,这样不支持 Draco 的客户端仍然可以使用未优化的版本。 在任何一种情况下,我们只想加载一个缓冲区。因此,我认为可能有必要重构 GLTF2Loader 以自上而下地请求依赖项。 建议的语法(除非有很好的现有示例可供模仿)将是这样的:
class GLTF2Parser {
loadMesh ( meshDef ) {
return Promise.all( [
this.loadGeometry( meshDef.primitives ),
this.loadMaterial( meshDef.material )
] ).then( ( dependencies ) => {
var [geometry, material] = dependencies;
var mesh new THREE.Mesh( geometry, material );
// ...
return mesh;
} );
}
// ...
}
^为了简洁起见,使用 ES6,尽管可能实际上无法检查到 examples/js。
在我开始重构之旅之前,是否有强烈的偏好应该如何工作? 我希望,但需要验证,这种变化可能会逐渐发生。
/cc @takahirox
我同意重构。
IMO _withDependencies
和_each
的组合有点复杂。
顺便说一句, @mrdoob你允许我们使用Promise
和 ES6 吗?
我想可以放弃 Internet Explorer 以获得可管理的代码来加载 gltf 👌
所以Promise
很酷。 ES6...取决于功能和浏览器兼容性。
感谢@takahirox的重构!
我认为这可以关闭。 有些部分不是严格自上而下的——对于具有多个场景的模型,我们可能有一天不希望通过getMultiDependencies()
检索节点或访问器。 但是对于我目前看到的所有示例模型,当前的结构看起来要好得多。
最有用的评论
我想可以放弃 Internet Explorer 以获得可管理的代码来加载 gltf 👌
所以
Promise
很酷。 ES6...取决于功能和浏览器兼容性。