Jak optimalizovat 3D modely v TypeScriptu

Jak optimalizovat 3D modely v TypeScriptu

Aspose.3D FOSS pro TypeScript poskytuje několik strategií pro snížení velikosti výstupního souboru a zlepšení propustnosti zpracování. Tento průvodce pokrývá výběr formátu, binární vkládání, paměťové pipeline a optimalizace na úrovni Node.js.

Průvodce krok za krokem

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

GLB (binary glTF) produkuje nejkompaktnější výstup s dobrou podporou nástrojů. OBJ je textový a větší. STL je kompaktní pro workflowy zaměřené pouze na geometrii.

FormátVelikostObsahuje materiályObsahuje animaciNejlepší využití
GLBMalýAno (vložené)AnoWeb, hry, obecná výměna
glTFStředníAno (samostatné)AnoVývoj, kontrola
STLMalýNeNe3D tisk, pouze geometrie
OBJVelkýSamostatný .mtlNeLegacy nástroje, široká kompatibilita
FBXStředníNe*Ne*Importér/exportér existuje, ale není napojen na automatické rozpoznání
3MFMalýAnoNeModerní 3D tisk

Krok 2: Export do binárního GLB

Při ukládání do GLB nastavte GltfSaveOptions.binaryMode = true tak, aby vytvořil jediný samostatný binární soubor. Tím se vyhnete samostatnému souboru .bin a je to vyžadováno mnoha 3D prohlížeči:

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 Buffer I/O pro pipeline v paměti

Při zpracování souborů ve webové službě použijte openFromBuffer a saveToBuffer, abyste se vyhnuli zápisu 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: Dávkové zpracování souborů pomocí pracovních vláken

Pro velké konverzní úlohy distribuujte práci napříč pracovními vlákny Node.js, abyste využili více jader 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: Sledovat paměť pro velké modely

Pro soubory větší než 50 MB monitorujte využití haldy a zpracovávejte soubory sekvenčně, pokud je paměť omezena:

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

Zvyšte haldu Node.js pro velmi velké modely:

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

Často kladené otázky

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

GLB (binary glTF) s vloženými prostředky produkuje nejkompaktnější jednosouborový výstup pro scény s materiály a texturami. STL je kompaktnější pro obsah pouze s geometrií.

Používá @aspose/3d zjednodušení meshe nebo LOD?

Ne. Knihovna čte a zapisuje zdrojovou geometrii, aniž by měnila topologii sítě. Zjednodušení sítě (redukování vrcholů, generování LOD) není podporováno.

Mohu odstranit materiály, abych snížil velikost souboru?

Nastavte ObjSaveOptions.enableMaterials = false při ukládání do OBJ. Pro glTF jsou vždy zahrnuty všechna data materiálu; použijte STL pro výstup pouze s geometrií.


Viz také

 Čeština