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をサポートしていないクライアントは最適化されていないバージョンにフォールバックできます。 いずれの場合も、バッファの1つだけをロードする必要があります。
  • (ドラフト) 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

最も参考になるコメント

gltfをロードするための管理可能なコードを取得するためにInternetExplorerを捨てても大丈夫だと思います👌

したがって、 Promiseはかっこいいです。 ES6 ...は機能とブラウザの互換性によって異なります。

全てのコメント3件

リファクタリングに同意します。
IMO _withDependencies_eachの組み合わせは少し複雑です。

ところで、 @ mrdoobPromiseとES6の使用を許可しますか?

gltfをロードするための管理可能なコードを取得するためにInternetExplorerを捨てても大丈夫だと思います👌

したがって、 Promiseはかっこいいです。 ES6 ...は機能とブラウザの互換性によって異なります。

リファクタリングしてくれてありがとう@takahirox

これは閉じることができると思います。 一部のパーツは厳密にはトップダウンではありません。複数のシーンがあるモデルの場合、いつかgetMultiDependencies()介してノードまたはアクセサーを取得したくない場合があります。 しかし、これまでに見たすべてのサンプルモデルについて、現在の構造ははるかに良く見えます。

このページは役に立ちましたか?
0 / 5 - 0 評価