Hoe 3D-modellen te optimaliseren in TypeScript

Hoe 3D-modellen te optimaliseren in TypeScript

Aspose.3D FOSS voor TypeScript biedt verschillende strategieën om de grootte van uitvoerbestanden te verkleinen en de verwerkingsdoorvoer te verbeteren. Deze gids behandelt formatselectie, binaire insluiting, in‑memory pipelines en optimalisaties op Node.js-niveau.

Stapsgewijze handleiding

Stap 1: Kies het juiste uitvoerformaat

GLB (binaire glTF) levert de meest compacte output met goede toolondersteuning. OBJ is tekstgebaseerd en groter. STL is compact voor workflows die alleen geometrie bevatten.

FormaatGrootteBevat materialenBevat animatieBeste gebruik
GLBKleinJa (ingesloten)JaWeb, games, algemene uitwisseling
glTFMediumJa (apart)JaOntwikkeling, inspectie
STLKleinNeeNee3D printing, geometry-only
OBJGrootAparte .mtlNeeLegacy-tools, brede compatibiliteit
FBXMiddelNee*Nee*Importer/exporter bestaat, maar is niet gekoppeld aan automatische detectie
3MFKleinJaNeeModern 3D-printen

Stap 2: Exporteer naar binaire GLB

Bij het opslaan naar GLB, stel GltfSaveOptions.binaryMode = true in om een enkel zelfvoorzienend binair bestand te produceren. Dit voorkomt de aparte .bin sidecar en is vereist voor veel 3D-viewers:

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

Stap 3: Gebruik Buffer I/O voor in‑memory pipelines

Bij het verwerken van bestanden in een webservice, gebruik openFromBuffer en saveToBuffer om te voorkomen dat er naar het bestandssysteem wordt geschreven:

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

Stap 4: Batchverwerk bestanden met worker threads

Voor grote conversietaken, verdeel het werk over Node.js worker threads om meerdere CPU-kernen te benutten:

// 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}`));
}

Stap 5: Houd het geheugen in de gaten voor grote modellen

Voor bestanden groter dan 50 MB, houd het heap‑gebruik in de gaten en verwerk bestanden opeenvolgend als het geheugen beperkt is:

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

Verhoog de Node.js-heap voor zeer grote modellen:

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

Veelgestelde vragen

Wat is het meest compacte uitvoerformaat?

GLB (binaire glTF) met ingesloten assets levert de meest compacte single‑file output voor scènes met materialen en texturen. STL is compacter voor alleen‑geometrie‑inhoud.

Past @aspose/3d mesh‑simplificatie of LOD toe?

Nee. De bibliotheek leest en schrijft de brongeometrie zonder de mesh‑topologie te wijzigen. Mesh‑simplificatie (vertexreductie, LOD‑generatie) wordt niet ondersteund.

Kan ik materialen verwijderen om de bestandsgrootte te verkleinen?

Stel ObjSaveOptions.enableMaterials = false bij het opslaan naar OBJ. Voor glTF worden alle materiaalgegevens altijd meegeleverd; gebruik STL voor alleen-geometry output.


Zie ook

 Nederlands