Three.js: GLTF2Loader deve carregar dependências de cima para baixo.

Criado em 11 ago. 2017  ·  3Comentários  ·  Fonte: mrdoob/three.js

O padrão atual em GLTF2Loader se parece com isto:

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 os acessadores (que por sua vez dependem de todos os .bin arquivos de buffer) serão carregados antes que qualquer malha possa ser criada. Isso apresenta um problema, se nem todos os buffers são realmente necessários. Por exemplo:

  • A extensão (rascunho) KHR_draco_mesh_compression permite que um ativo inclua um arquivo Draco .bin e um .bin descompactado, para que os clientes que não suportam Draco ainda possam recorrer à versão não otimizada. Em qualquer um dos casos, queremos carregar apenas um dos buffers.
  • A extensão MSFT_lod (rascunho) tem essencialmente o mesmo problema.
  • Já é válido, embora eu não tenha visto nenhum exemplo, declarar materiais de metal áspero e de brilho específico na mesma malha. O carregador pode escolher qual usar, de acordo com o desempenho e suporte de recursos, mas você certamente não não quero solicitar as texturas para ambos. Atualmente, isso é exatamente o que o GLTF2Loader faria.

Portanto, acho que pode ser necessário reestruturar o GLTF2Loader para solicitar dependências de cima para baixo. A sintaxe proposta (a menos que haja bons exemplos existentes para imitar) seria algo assim:

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 concisão, embora presumivelmente isso não possa realmente ser verificado em examples / js.

Antes de embarcar em uma jornada de refatoração, alguma preferência forte sobre como isso deve funcionar? Espero, mas preciso verificar, que essa mudança possa acontecer de forma incremental.

/ cc @takahirox

Comentários muito úteis

Acho que não há problema em abandonar o Internet Explorer para obter um código gerenciável para carregar o gltf 👌

Então Promise s são legais. ES6 ... depende do recurso e compatibilidade do navegador.

Todos 3 comentários

Eu concordo com a refatoração.
Na minha opinião, a combinação de _withDependencies e _each é um pouco complexa.

BTW, @mrdoob , você nos permite usar Promise e ES6?

Acho que não há problema em abandonar o Internet Explorer para obter um código gerenciável para carregar o gltf 👌

Então Promise s são legais. ES6 ... depende do recurso e compatibilidade do navegador.

Obrigado @takahirox pela refatoração!

Eu acho que isso pode ser fechado. Algumas partes não são estritamente de cima para baixo - para um modelo com várias cenas, podemos algum dia não querer ter nós ou acessores recuperados por meio de getMultiDependencies() . Mas para todos os modelos de exemplo que vi até agora, a estrutura atual parece muito melhor.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

jack-jun picture jack-jun  ·  3Comentários

fuzihaofzh picture fuzihaofzh  ·  3Comentários

zsitro picture zsitro  ·  3Comentários

Horray picture Horray  ·  3Comentários

makc picture makc  ·  3Comentários