Как да оптимизираме 3D модели в TypeScript

Как да оптимизираме 3D модели в TypeScript

Aspose.3D FOSS за TypeScript предоставя няколко стратегии за намаляване на размера на изходния файл и подобряване на пропускателната способност на обработката. Това ръководство обхваща избор на формат, вграждане на бинарни данни, конвейери в паметта и оптимизации на ниво Node.js.

Ръководство стъпка по стъпка

Стъпка 1: Изберете правилния изходен формат

GLB (бинарен glTF) генерира най-компактен изход с добра поддръжка от инструменти. OBJ е текстов и по-голям. STL е компактен за работни потоци, съдържащи само геометрия.

ФорматРазмерВключва материалиВключва анимацияНай-добра употреба
GLBМалъкДа (вградено)ДаУеб, игри, общ обмен
glTFMediumДа (отделно)ДаРазработка, инспекция
STLМалъкНеНе3D printing, geometry-only
OBJГолямОтделен .mtlНеНаследени инструменти, широка съвместимост
FBXСреденНе*Не*Импортер/експортер съществуват, но не са включени в автоматичното откриване
3MFМалъкДаНеСъвременно 3D печатане

Стъпка 2: Експортиране в бинарен GLB

При запазване в GLB, задайте GltfSaveOptions.binaryMode = true за да създадете един самостоятелен двоичен файл. Това избягва отделния .bin sidecar и е необходимо за много 3D визуализатори:

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: Използвайте Buffer I/O за конвейери в паметта

Когато обработвате файлове в уеб услуга, използвайте openFromBuffer и saveToBuffer за да избегнете записване във файловата система:

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

Стъпка 4: Пакетна обработка на файлове с Worker Threads

За големи задачи по конвертиране разпределете работата между worker threads в Node.js, за да използвате множество 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}`));
}

Стъпка 5: Наблюдавайте паметта за големи модели

За файлове над 50 MB наблюдавайте използването на купчината и обработвайте файловете последователно, ако паметта е ограничена:

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

Увеличете купчината на Node.js за много големи модели:

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

Често задавани въпроси

Кой е най-компактният изходен формат?

GLB (бинарен glTF) с вградени активи произвежда най-компактния еднофайлов изход за сцени с материали и текстури. STL е по-компактен за съдържание, съдържащо само геометрия.

Прилага ли @aspose/3d опростяване на мрежата или LOD?

Не. Библиотеката чете и записва изходната геометрия без да променя топологията на мрежата. Опростяването на мрежата (намаляване на върховете, генериране на LOD) не се поддържа.

Мога ли да премахна материалите, за да намаля размера на файла?

Задайте ObjSaveOptions.enableMaterials = false при запазване в OBJ. За glTF, всички данни за материалите винаги се включват; използвайте STL за изход само с геометрия.


Вижте също

 Български