Kā optimizēt 3D modeļus TypeScript valodā

Kā optimizēt 3D modeļus TypeScript valodā

Aspose.3D FOSS for TypeScript piedāvā vairākas stratēģijas, lai samazinātu izvada faila lielumu un uzlabotu apstrādes caurplūdi. Šis ceļvedis aptver formāta izvēli, bināro iegulšanu, atmiņā esošas cauruļvadu apstrādes un Node.js līmeņa optimizācijas.

Solī pa solim ceļvedis

1. solis: Izvēlieties pareizo izvada formātu

GLB (binārais glTF) rada viskompakto izvadīšanu ar labu rīku atbalstu. OBJ ir teksta bāzēts un lielāks. STL ir kompakts ģeometrijas tikai darbplūsmām.

FormātsIzmērsIetver materiālusIetver animācijuLabākā lietošana
GLBMazsJā (iekļauts)Tīmeklis, spēles, vispārēja apmaiņa
glTFVidējsJā (atsevišķi)Izstrāde, pārbaude
STLMazs3D printing, geometry-only
OBJLielsAtsevišķs .mtlMantotie rīki, plaša saderība
FBXVidējsNē*Nē*Importētājs/eksportētājs pastāv, bet nav savienots ar automātisko noteikšanu
3MFMazsMūsdienīga 3D drukāšana

2. solis: Eksportēt uz bināro GLB

Saglabājot uz GLB, iestatiet GltfSaveOptions.binaryMode = true lai izveidotu vienu pašpietiekamu bināro failu. Tas novērš atsevišķo .bin palīgfailu un ir nepieciešams daudzām 3D skatītājprogrammām:

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

3. solis: Izmantojiet bufera I/O atmiņā esošām cauruļvadu apstrādēm

Apstrādājot failus tīmekļa pakalpojumā, izmantojiet openFromBuffer un saveToBuffer lai izvairītos no rakstīšanas failu sistēmā:

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('output.glb');
}

4. solis: Grupveida apstrāde ar darbinieku pavedieniem

Lieliem konvertēšanas uzdevumiem izplatiet darbu pāri Node.js darbinieku pavedieniem, lai izmantotu vairākus CPU kodolus:

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

5. solis: Uzraudzīt atmiņu lieliem modeļiem

Failiem, kas pārsniedz 50 MB, uzraugiet kaudzes (heap) lietojumu un apstrādājiet failus secīgi, ja atmiņa ir ierobežota:

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

Palieliniet Node.js kaudzi ļoti lieliem modeļiem:

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

Biežāk uzdotie jautājumi

Kāds ir viskompaktais izvada formāts?

GLB (binārais glTF) ar iegultajiem resursiem rada viskompakto vienfaila izvadīšanu ainas ar materiāliem un tekstūrām gadījumā. STL ir kompakts ģeometrijas tikai saturam.

Vai @aspose/3d piemēro režģa vienkāršošanu vai LOD?

Nē. Bibliotēka lasa un raksta avota ģeometriju, nemodificējot režģa topoloģiju. Tīklu vienkāršošana (virsotņu reducēšana, LOD ģenerēšana) netiek atbalstīta.

Vai varu noņemt materiālus, lai samazinātu faila lielumu?

Iestatīt ObjSaveOptions.enableMaterials = false kad saglabā OBJ. Attiecībā uz glTF, visi materiālu dati vienmēr tiek iekļauti; izmantojiet STL, lai iegūtu tikai ģeometrijas izvadi.


Skatīt arī

 Latviešu