Three.js: GLTF2Loader harus memuat dependensi dari atas ke bawah.

Dibuat pada 11 Agu 2017  ·  3Komentar  ·  Sumber: mrdoob/three.js

Pola saat ini di GLTF2Loader terlihat seperti ini:

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;

    } );

  }

  // ...
}

Akibatnya, semua pengakses (yang pada gilirannya bergantung pada semua file buffer .bin ) akan dimuat sebelum mesh apa pun dapat dibuat. Ini menimbulkan masalah, jika tidak semua buffer benar-benar dibutuhkan. Sebagai contoh:

  • Ekstensi (draft) KHR_draco_mesh_compression memungkinkan aset untuk menyertakan file Draco .bin , dan .bin yang tidak dikompresi, sehingga klien yang tidak mendukung Draco masih dapat menggunakan versi yang tidak dioptimalkan. Dalam kedua kasus, kami hanya ingin memuat salah satu buffer.
  • Ekstensi MSFT_lod (draf) pada dasarnya memiliki masalah yang sama.
  • Sudah valid, meskipun saya belum melihat contoh apa pun, untuk mendeklarasikan material metal-rough dan spec-gloss pada mesh yang sama. Loader dapat memilih mana yang akan digunakan, sesuai dengan kinerja dan dukungan fitur, tetapi Anda tentu tidak' t ingin meminta tekstur untuk keduanya. Saat ini, inilah yang akan dilakukan GLTF2Loader.

Jadi, saya pikir mungkin perlu untuk merestrukturisasi GLTF2Loader untuk meminta dependensi top-down. Sintaks yang diusulkan (kecuali ada contoh bagus untuk ditiru) akan menjadi seperti ini:

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;

     } );

  }

  // ...
}

^Menggunakan ES6 untuk keringkasan, meskipun mungkin itu sebenarnya tidak dapat diperiksa ke dalam contoh/js.

Sebelum saya memulai perjalanan refactoring, ada preferensi kuat tentang bagaimana ini seharusnya bekerja? Saya berharap, tetapi perlu memverifikasi, bahwa perubahan ini dapat terjadi secara bertahap.

/cc @takahirox

Komentar yang paling membantu

Saya kira tidak apa-apa untuk membuang Internet Explorer untuk mendapatkan kode yang dapat dikelola untuk memuat gltf

Jadi Promise itu keren. ES6... tergantung pada fitur dan kompatibilitas browser.

Semua 3 komentar

Saya setuju dengan refactoring.
IMO kombinasi _withDependencies dan _each agak rumit.

BTW, @mrdoob apakah Anda mengizinkan kami menggunakan Promise dan ES6?

Saya kira tidak apa-apa untuk membuang Internet Explorer untuk mendapatkan kode yang dapat dikelola untuk memuat gltf

Jadi Promise itu keren. ES6... tergantung pada fitur dan kompatibilitas browser.

Terima kasih @takahirox untuk refactoringnya!

Saya pikir ini bisa ditutup. Beberapa bagian tidak sepenuhnya top-down — untuk model dengan banyak adegan, kita mungkin suatu hari nanti tidak ingin node atau pengakses diambil melalui getMultiDependencies() . Tetapi untuk semua contoh model yang saya lihat sejauh ini, struktur saat ini terlihat jauh lebih baik.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat