Como otimizar modelos 3D em TypeScript

Como otimizar modelos 3D em TypeScript

Aspose.3D FOSS para TypeScript oferece várias estratégias para reduzir o tamanho dos arquivos de saída e melhorar o rendimento do processamento. Este guia cobre a seleção de formato, incorporação binária, pipelines em memória e otimizações ao nível do Node.js.

Guia passo a passo

Etapa 1: Escolha o Formato de Saída Correto

GLB (binary glTF) produz a saída mais compacta com bom suporte de ferramentas. OBJ é baseado em texto e maior. STL é compacto para fluxos de trabalho apenas de geometria.

FormatoTamanhoInclui MateriaisInclui AnimaçãoMelhor Uso
GLBPequenoSim (incorporado)SimWeb, jogos, troca geral
glTFMédioSim (separado)SimDesenvolvimento, inspeção
STLPequenoNãoNão3D printing, geometry-only
OBJGrandeSeparado .mtlNãoFerramentas legadas, ampla compatibilidade
FBXMédioNão*Não*Importador/exportador existe, mas não está integrado à detecção automática
3MFPequenoSimNãoImpressão 3D moderna

Etapa 2: Exportar para GLB Binário

Ao salvar para GLB, defina GltfSaveOptions.binaryMode = true para produzir um único arquivo binário autônomo. Isso evita o .bin sidecar e é necessário para muitos visualizadores 3D:

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import { GltfSaveOptions } from '@aspose/3d/formats/gltf';

const scene = new Scene();
scene.open('complex-model.obj', new ObjLoadOptions());

const opts = new GltfSaveOptions();
opts.binaryMode = true;

scene.save('optimized.glb', opts);
console.log('Saved compact binary GLB');

Etapa 3: Use I/O de Buffer para Pipelines em Memória

Ao processar arquivos em um serviço web, use openFromBuffer e saveToBuffer para evitar gravar no sistema de arquivos:

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';

function convertInMemory(inputBuffer: Buffer): Buffer {
    const scene = new Scene();
    scene.openFromBuffer(inputBuffer, new ObjLoadOptions());
    return scene.saveToBuffer('glb');
}

Etapa 4: Processar Arquivos em Lote com Worker Threads

Para trabalhos de conversão grandes, distribua o trabalho entre worker threads do Node.js para usar múltiplos núcleos de CPU:

// worker.ts
import { workerData, parentPort } from 'worker_threads';
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';

const { inputPath, outputPath } = workerData;

const scene = new Scene();
scene.open(inputPath, new ObjLoadOptions());
scene.save(outputPath);

parentPort?.postMessage({ done: true, output: outputPath });
// main.ts: dispatch files to workers
import { Worker } from 'worker_threads';
import * as fs from 'fs';
import * as path from 'path';

const files = fs.readdirSync('./input').filter(f => f.endsWith('.obj'));

for (const file of files) {
    const inputPath = path.join('./input', file);
    const outputPath = path.join('./output', file.replace('.obj', '.glb'));

    const worker = new Worker('./dist/worker.js', {
        workerData: { inputPath, outputPath }
    });

    worker.on('message', msg => console.log(`Converted: ${msg.output}`));
    worker.on('error', err => console.error(`Error: ${err}`));
}

Etapa 5: Monitore a Memória para Modelos Grandes

Para arquivos acima de 50 MB, monitore o uso do heap e processe os arquivos sequencialmente se a memória for limitada:

function logMemory(label: string) {
    const used = process.memoryUsage();
    console.log(`[${label}] heapUsed: ${Math.round(used.heapUsed / 1024 / 1024)} MB`);
}

logMemory('before load');
const scene = new Scene();
scene.open('large-model.obj');
logMemory('after load');
scene.save('output.glb');
logMemory('after save');

Aumente o heap do Node.js para modelos muito grandes:

node --max-old-space-size=8192 convert.js

Perguntas Frequentes

Qual é o formato de saída mais compacto?

GLB (binary glTF) com ativos incorporados produz a saída de arquivo único mais compacta para cenas com materiais e texturas. STL é mais compacto para conteúdo apenas de geometria.

O @aspose/3d aplica simplificação de malha ou LOD?

Não. A biblioteca lê e grava a geometria de origem sem modificar a topologia da malha. Simplificação de malha (redução de vértices, geração de LOD) não é suportada.

Posso remover os materiais para reduzir o tamanho do arquivo?

Definir ObjSaveOptions.enableMaterials = false ao salvar em OBJ. Para glTF, todos os dados de material são sempre incluídos; use STL para saída apenas de geometria.


Veja Também

 Português