Jak optimalizovat 3D modely v TypeScriptu

Jak optimalizovat 3D modely v TypeScriptu

Aspose.3D FOSS pro TypeScript poskytuje několik strategií ke snížení velikosti výstupního souboru a zlepšení výkonu zpracování. Tato příručka pokrývá volbu formátu, binární vestavení, pipelines ve paměti a optimalizace na úrovni Node.js .

Krok za krokem

Krok 1: Vyberte správný výstupní formát

GLB (binární glTF) produkuje nejkompaktnější výstup s dobrou podporou nástrojů. OBJ je textově založený a větší. STL je kompaktní pro geometrické pracovní postupy.

FormátVelikostZahrnuje materiályAnimované díloNejlepší využití
GLBMalý.Ano (vestavěné)Ano , ano .Web, hry, všeobecná výměna
glTFStředníAno (oddělené)Ano , ano .Vývoj, kontrola
STLMalý.Ne, ne.Ne, ne.3D printing, geometry-only
OBJVelkéOddělené .mtlNe, ne.Základní nástroje, široká kompatibilita
FBXStředníNe*Ne*Existují dovozci/vývozci, ale nejsou připojeni k automatickému detekci.
3MFMalý.Ano , ano .Ne, ne.Moderní 3D tisk

Krok 2: Export do binárního GLB

Při ušetření na GLB se stanoví: GltfSaveOptions.binaryMode = true V tomto případě se vyhneme oddělenému souboru. .bin Sidecar a je požadován pro mnoho 3D diváků:

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');

Krok 3: Použijte nárazník I/O pro potrubí v paměti

Při zpracování souborů ve webové službě použijte openFromBuffer a) saveToBuffer aby se zabránilo psaní do souborového systému:

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');
}

Krok 4: Soubory s procesem na dávku a pracovními nitky

Pro velké konverzní úkoly rozdělejte práci mezi pracovní nitky Node.js, abyste použili více jádrů 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}`));
}

Krok 5: Monitorování paměti pro velké modely

U souborů o velikosti větší než 50 MB monitorujte využití hromady a zpracováváte soubory postupně, pokud je paměť omezená:

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');

Zvýšit hromadu Node.js pro velmi velké modely:

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

Časté otázky

Jaký je nejkompaktnější výstupní formát?

GLB (binární glTF) s vloženými aktivy produkuje nejkompaktnější výstup v jednom souboru pro scény se materiály a texturami. STL je kompaktější pouze pro obsah geometrie.

Použije @aspose/3d zjednodušení nebo LOD?

Ne. Knihovna čte a píše geometrii zdroje bez úpravy topologie sítě. Zjednodušení sítí (redukce vrcholu, generace LOD) není podporováno.

Můžu z toho oddělit materiály, abych zmenšil velikost souboru?

Sestavení: ObjSaveOptions.enableMaterials = false při ukládání na OBJ. U glTF jsou vždy zahrnuty všechny materiální údaje; pro výstup pouze s geometrií použijte STL.


Viz také:

 Čeština