Kaip optimizuoti 3D modelius TypeScript

Kaip optimizuoti 3D modelius TypeScript

Aspose.3D FOSS for TypeScript suteikia kelias strategijas, kaip sumažinti išvesties failo dydį ir pagerinti apdorojimo pralaidumą. Šiame vadove nagrinėjami formato pasirinkimas, dvejetainis įterpimas, atminties kanalai ir Node.js lygio optimizacijos.

Žingsnis po žingsnio vadovas

Žingsnis 1: Pasirinkite tinkamą išvesties formatą

GLB (binary glTF) sukuria pats kompaktiškiausią išvestį, turint gerą įrankių palaikymą. OBJ yra tekstinis ir didesnis. STL yra kompaktiškas geometrinių duomenų tik darbo srautams.

FormatasDydisĮtraukia medžiagasĮtraukia animacijąGeriausia paskirtis
GLBMažasTaip (įterptas)TaipŽiniatinklis, žaidimai, bendras mainai
glTFVidutinisTaip (atskiras)TaipKūrimas, patikrinimas
STLMažasNeNe3D printing, geometry-only
OBJDidelisAtskiras .mtlNeSenosios priemonės, plati suderinamumas
FBXVidutinisNe*Ne*Importuotojas/eksportuotojas egzistuoja, tačiau nėra integruotas į automatinį aptikimą
3MFMažasTaipNeModernus 3D spausdinimas

Žingsnis 2: Eksportuokite į binarinį GLB

Išsaugant į GLB, nustatykite GltfSaveOptions.binaryMode = true sukurti vieną savarankišką binarinį failą. Tai išvengia atskirą .bin šoninio failo ir yra būtina daugeliui 3D peržiūros programų:

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

Žingsnis 3: Naudokite buferio I/O atminties vidiniams kanalams

Apdorojant failus žiniatinklio paslaugoje, naudokite openFromBuffer ir saveToBuffer kad išvengtumėte rašymo į failų sistemą:

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

Žingsnis 4: Masinis failų apdorojimas naudojant darbinės gijos

Dideliems konvertavimo darbams paskirstykite darbą tarp Node.js darbinės gijos, kad naudotumėte kelias CPU branduolius:

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

Žingsnis 5: Stebėkite atmintį dideliems modeliams

Failams, viršijančioms 50 MB, stebėkite krūvos (heap) naudojimą ir, jei atmintis ribota, apdorokite failus nuosekliai:

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

Padidinkite Node.js krūvą (heap) labai dideliems modeliams:

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

Dažnai užduodami klausimai

Koks yra pats kompaktiškiausias išvesties formatas?

GLB (binary glTF) su įterptais ištekliais sukuria pats kompaktiškiausią vieno failo išvestį scenoms su medžiagomis ir tekstūromis. STL yra kompaktiškesnis, kai turinys susijęs tik su geometrija.

Ar @aspose/3d taiko tinklo (mesh) supaprastinimą arba LOD?

Ne. Biblioteka skaito ir rašo šaltinio geometriją nekeisdama tinklo topologijos. Tinklo supaprastinimas (viršūnių sumažinimas, LOD generavimas) nepalaikomas.

Ar galiu pašalinti medžiagas, kad sumažinčiau failo dydį?

Nustatykite ObjSaveOptions.enableMaterials = false kai išsaugoma į OBJ. Dėl glTF, visi medžiagų duomenys visada įtraukiami; naudokite STL, jei norite tik geometrijos išvesties.


Žr. taip pat

 Lietuvių