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

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

Aspose.3D FOSS для TypeScript предоставляет несколько стратегий по уменьшению размера выходных файлов и повышению пропускной способности обработки. Это руководство охватывает выбор формата, встраивание бинарных данных, конвейеры в памяти и оптимизации на уровне Node.js.

Пошаговое руководство

Шаг 1: Выберите правильный формат вывода

GLB (binary glTF) обеспечивает наиболее компактный вывод при хорошей поддержке инструментов. OBJ — текстовый и более объёмный. STL компактен для рабочих процессов, содержащих только геометрию.

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

Шаг 2: Экспорт в бинарный GLB

При сохранении в GLB установите GltfSaveOptions.binaryMode = true чтобы создать один автономный бинарный файл. Это устраняет отдельный .bin файл‑партнёр и требуется для многих 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 для конвейеров в памяти

При обработке файлов в веб‑сервисе используйте 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‑потоками 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 МБ следите за использованием кучи и обрабатывайте файлы последовательно, если память ограничена:

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 (binary glTF) с встроенными ресурсами обеспечивает наиболее компактный однопоточный вывод для сцен с материалами и текстурами. STL более компактен для контента, содержащего только геометрию.

Применяет ли @aspose/3d упрощение сетки или LOD?

Нет. Библиотека читает и записывает исходную геометрию без изменения топологии сетки. Упрощение сетки (сокращение вершин, генерация LOD) не поддерживается.

Могу ли я убрать материалы, чтобы уменьшить размер файла?

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


См. также

 Русский