Three.js: GLTF2Loader 应该自上而下加载依赖项。

创建于 2017-08-11  ·  3评论  ·  资料来源: mrdoob/three.js

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缓冲区文件)将在创建任何网格之前加载。 这引入了一个问题,如果不是所有的缓冲区实际上都需要的话。 例如:

  • (草案) KHR_draco_mesh_compression扩展允许资产包含一个 Draco .bin文件和一个未压缩的.bin ,这样不支持 Draco 的客户端仍然可以使用未优化的版本。 在任何一种情况下,我们只想加载一个缓冲区。
  • (草案) MSFT_lod扩展有本质上相同的问题。
  • 虽然我没有看到任何例子,但在同一个网格上声明金属粗糙和规格光泽材料已经是有效的。加载器可以根据性能和功能支持选择使用哪个,但你肯定不会不想请求两者的纹理。 目前,这正是 GLTF2Loader 会做的。

因此,我认为可能有必要重构 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

最有用的评论

我想可以放弃 Internet Explorer 以获得可管理的代码来加载 gltf 👌

所以Promise很酷。 ES6...取决于功能和浏览器兼容性。

所有3条评论

我同意重构。
IMO _withDependencies_each的组合有点复杂。

顺便说一句, @mrdoob你允许我们使用Promise和 ES6 吗?

我想可以放弃 Internet Explorer 以获得可管理的代码来加载 gltf 👌

所以Promise很酷。 ES6...取决于功能和浏览器兼容性。

感谢@takahirox的重构!

我认为这可以关闭。 有些部分不是严格自上而下的——对于具有多个场景的模型,我们可能有一天不希望通过getMultiDependencies()检索节点或访问器。 但是对于我目前看到的所有示例模型,当前的结构看起来要好得多。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Horray picture Horray  ·  3评论

yqrashawn picture yqrashawn  ·  3评论

scrubs picture scrubs  ·  3评论

fuzihaofzh picture fuzihaofzh  ·  3评论

Bandit picture Bandit  ·  3评论