Разработчикам Node.js, работающим с 3D‑контентом, часто требуется конвертировать файлы между форматами: инструмент проектирования экспортирует OBJ, веб‑рендерер ожидает GLB, 3D‑принтер требует STL, а производственный конвейер использует 3MF. Обработка этих конвертаций с помощью единого, согласованного API уменьшает количество внешних инструментов в конвейере и сохраняет логику конвертации внутри кода приложения, где её можно тестировать и версионировать.
Эта @aspose/3d пакет (v24.12.0, лицензия MIT) предоставляет API, ориентированное на TypeScript, для чтения и записи всех основных 3D‑форматов в Node.js. Это руководство проходит через наиболее распространённые рабочие процессы конвертации.
Установка
npm install @aspose/3d
Требования: Node.js 18, 20 или 22; TypeScript 5.0 или новее. Единственная зависимость во время выполнения — xmldom.
Поддерживаемые форматы
В таблице ниже перечислены форматы, рассматриваемые в этом руководстве, и их поддержка чтения/записи.
| Формат | Расширение | Чтение | Запись | Примечания |
|---|---|---|---|---|
| Wavefront OBJ | .obj | Да | Да | Читает/записывает .mtl файлы материалов |
| glTF 2.0 (JSON) | .gltf | Да | Да | Стандартный формат веб‑доставки |
| glTF 2.0 (Бинарный) | .glb | Да | Да | Самодостаточный, предпочтительный для веба |
| STL (ASCII/Бинарный) | .stl | Да | Да | Стандартный формат 3D-печати |
| 3MF | .3mf | Да | Да | Производственный формат с богатыми метаданными |
| FBX | .fbx | Нет* | Нет* | Импортёр/экспортер существует, но автоматическое определение формата не подключено; не используется через scene.open() |
| COLLADA | .dae | Да | Да | Обменный формат на основе XML |
OBJ поддерживает как импорт, так и экспорт. Загрузите с помощью scene.open() и сохраните с помощью scene.save('output.obj'), или конвертировать в любой другой поддерживаемый формат, такой как glTF, STL, или 3MF.
OBJ в GLB (веб‑доставка)
Конвертация OBJ в бинарный glTF (GLB) — самый распространённый веб‑рабочий процесс. GLB представляет собой автономный бинарный пакет: текстуры, геометрия и метаданные находятся в одном файле, что делает его эффективным для доставки по HTTP и прямой загрузки в Three.js, Babylon.js и model-viewer.
import { Scene } from '@aspose/3d';
function convertObjToGlb(inputPath: string, outputPath: string): void {
const scene = new Scene();
scene.open(inputPath);
scene.save(outputPath); // extension '.glb' selects binary GLB format
console.log(`Converted ${inputPath} -> ${outputPath}`);
}
convertObjToGlb('model.obj', 'model.glb');
Формат вывода определяется по расширению файла. Используйте .glb для бинарного GLB или .gltf для отдельного JSON + .bin раскладка.
OBJ в STL (подготовка к 3D‑печати)
STL — lingua franca FDM и SLA 3D‑печати. Слайсеры, такие как PrusaSlicer, Bambu Studio и Chitubox, принимают STL. Конвертация из OBJ в STL проста, поскольку оба формата хранят треугольные сетки.
import { Scene } from '@aspose/3d';
function convertObjToStl(inputPath: string, outputPath: string): void {
const scene = new Scene();
scene.open(inputPath);
scene.save(outputPath); // extension '.stl' selects STL format
console.log(`STL written to ${outputPath}`);
}
convertObjToStl('part.obj', 'part.stl');
STL не сохраняет цвет, материалы или UV‑данные. Если ваш OBJ‑файл использует группы материалов, эта информация будет отброшена при экспорте. Для форматов печати, сохраняющих цвет, рассмотрите 3MF (см. ниже).
STL в glTF (сканер и CAD в веб)
Сканеры со структурированным светом и параметрические экспортеры CAD обычно выводят STL. Конвертация в glTF делает геометрию доступной в веб‑просмотрщиках и AR‑платформах без этапа серверного рендеринга.
import { Scene } from '@aspose/3d';
function convertStlToGltf(inputPath: string, outputPath: string): void {
const scene = new Scene();
scene.open(inputPath);
// extension '.gltf' saves as JSON + .bin sidecar
scene.save(outputPath);
console.log(`glTF written to ${outputPath}`);
}
convertStlToGltf('scan_output.stl', 'scan_output.gltf');
Поскольку STL не содержит информации о материалах или текстурах, полученный файл glTF будет содержать только геометрию. При необходимости вы можете программно прикреплять материалы к узлам сцены после загрузки.
3MF to glTF (Manufacturing to Visualization)
Формат 3D‑производства (3MF) всё чаще используется в процессах аддитивного производства, поскольку он хранит цвет, материалы, иерархию компонентов и метаданные печати вместе с геометрией. Преобразование 3MF в glTF позволяет выполнять последующую визуализацию в веб‑инструментах, сохраняя структуру сцены.
import { Scene } from '@aspose/3d';
function convert3mfToGlb(inputPath: string, outputPath: string): void {
const scene = new Scene();
scene.open(inputPath);
scene.save(outputPath); // extension '.glb' selects binary GLB format
console.log(`3MF -> GLB: ${outputPath}`);
}
convert3mfToGlb('assembly.3mf', 'assembly.glb');
3MF files often contain multi-component assemblies. The scene graph produced by scene.open() сохраняет иерархию компонентов в scene.rootNode.childNodes, так что вы можете просматривать или изменять отдельные части перед сохранением.
Шаблон пакетного преобразования
При обработке каталога файлов оберните каждое преобразование в try/catch чтобы один повреждённый файл не прерывал всю партию.
import { Scene } from '@aspose/3d';
import { readdirSync } from 'fs';
import { join, basename, extname } from 'path';
interface ConversionResult {
input: string;
output: string;
success: boolean;
error?: string;
}
function batchConvertToGlb(
inputDir: string,
outputDir: string,
extensions: string[] = ['.obj', '.stl', '.3mf', '.dae'] // .fbx excluded: format auto-detection not wired
): ConversionResult[] {
const results: ConversionResult[] = [];
const files = readdirSync(inputDir).filter((f) =>
extensions.includes(extname(f).toLowerCase())
);
for (const file of files) {
const inputPath = join(inputDir, file);
const outputPath = join(outputDir, basename(file, extname(file)) + '.glb');
try {
const scene = new Scene();
scene.open(inputPath);
scene.save(outputPath); // extension '.glb' infers GLB format
results.push({ input: inputPath, output: outputPath, success: true });
} catch (err) {
const message = err instanceof Error ? err.message : String(err);
results.push({ input: inputPath, output: outputPath, success: false, error: message });
console.error(`Failed to convert ${file}: ${message}`);
}
}
const succeeded = results.filter((r) => r.success).length;
console.log(`Batch complete: ${succeeded}/${results.length} files converted.`);
return results;
}
// Usage
batchConvertToGlb('./input', './output');
Приведённый выше шаблон читает каждое поддерживаемое расширение файлов из входного каталога, конвертирует в GLB и регистрирует любые ошибки без остановки цикла. Возвращаемый массив ConversionResult объектов можно использовать для отчётности или логики повторных попыток.
Заключение
@aspose/3d охватывает весь спектр потребностей в конвертации форматов в приложении Node.js TypeScript с последовательным двухшаговым API: scene.open() для загрузки, scene.save() для записи. Ключевое ограничение, которое следует помнить, заключается в том, что классы импортера и экспортера FBX существуют, но автоматическое определение формата ещё не реализовано, поэтому файлы FBX нельзя загрузить через scene.open().
Для получения более подробной информации о Scene, Node, и Mesh классы, используемые в этих примерах, см. страницы справочника классов в этой документации.