Three.js: GLTF2Loader debería cargar las dependencias de arriba hacia abajo.

Creado en 11 ago. 2017  ·  3Comentarios  ·  Fuente: mrdoob/three.js

El patrón actual en GLTF2Loader se parece a esto:

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;

    } );

  }

  // ...
}

Como resultado, todos los descriptores de acceso (que a su vez dependen de todos los archivos de búfer .bin ) se cargarán antes de que se puedan crear mallas. Esto presenta un problema, si no todos los búferes son realmente necesarios. Por ejemplo:

  • La extensión (borrador) KHR_draco_mesh_compression permite que un activo incluya un archivo .bin Draco y un archivo .bin sin comprimir, para que los clientes que no admitan Draco puedan recurrir a la versión no optimizada. En cualquier caso, queremos cargar solo uno de los búferes.
  • La extensión (borrador) MSFT_lod tiene esencialmente el mismo problema.
  • Ya es válido, aunque no he visto ningún ejemplo, declarar materiales de metal rugoso y de brillo de especificaciones en la misma malla. El cargador puede elegir cuál usar, de acuerdo con el rendimiento y el soporte de funciones, pero ciertamente no lo hace. No quiero solicitar las texturas para ambos. Actualmente, esto es exactamente lo que haría GLTF2Loader.

Entonces, creo que podría ser necesario reestructurar GLTF2Loader para solicitar dependencias de arriba hacia abajo. La sintaxis propuesta (a menos que existan buenos ejemplos existentes para imitar) sería algo como esto:

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;

     } );

  }

  // ...
}

^ Usando ES6 para concisión, aunque presumiblemente eso no se puede verificar en examples / js.

Antes de embarcarme en un viaje de refactorización, ¿alguna preferencia fuerte sobre cómo debería funcionar? Espero, pero tendré que verificar, que este cambio pueda ocurrir de forma incremental.

/ cc @takahirox

Comentario más útil

Supongo que está bien deshacerse de Internet Explorer para obtener un código manejable para cargar gltf 👌

Entonces Promise s son geniales. ES6 ... depende de la función y la compatibilidad del navegador.

Todos 3 comentarios

Estoy de acuerdo con la refactorización.
En mi opinión, la combinación de _withDependencies y _each es un poco compleja.

Por cierto, @mrdoob , ¿nos permite usar Promise y ES6?

Supongo que está bien deshacerse de Internet Explorer para obtener un código manejable para cargar gltf 👌

Entonces Promise s son geniales. ES6 ... depende de la función y la compatibilidad del navegador.

¡Gracias @takahirox por la refactorización!

Creo que esto se puede cerrar. Algunas partes no son estrictamente de arriba hacia abajo: para un modelo con múltiples escenas, es posible que algún día no deseemos que los nodos o accesos se recuperen a través de getMultiDependencies() . Pero para todos los modelos de ejemplo que he visto hasta ahora, la estructura actual se ve mucho mejor.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

scrubs picture scrubs  ·  3Comentarios

seep picture seep  ·  3Comentarios

akshaysrin picture akshaysrin  ·  3Comentarios

makc picture makc  ·  3Comentarios

zsitro picture zsitro  ·  3Comentarios