Node.js разработчиците, работещи с 3D съдържание често трябва да конвертират между формати: дизайн инструмент изнася OBJ, уеб рендера очаква GLB, 3Д принтер изисква 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.

Подкрепени формати

Таблицата по-долу представя форматите, покрити в този ръководство и тяхната подкрепа за четене/писан.

ФорматътРазширяванеПрочететеПисанебележки
OBJ.objДаДаПрочети / писания .mtl Материални файлове
ГЛТФ.gltf, .glbДаДа.gltf е JSON формат; .glb Самоконтейнерна бинарна система
STL.stlДаДа3D формат за печат: ASCII и бинарни
3MF.3mfДаДаИзграждане на богата метаданна
FBX.fbxНе *Не *Вносител/експортер съществува, но форматът на автоматично откриване не е вграден; не може да се използва чрез scene.open()
COLLADA.daeДаДаXML формат за обмен на данни

OBJ поддържа както внос, така и износ. scene.open() и спасяват с scene.save('output.obj'),или конвертирате към друг поддържан формат като glTF, STL или 3MF.

OBJ до GLB (Web Delivery)

Конвертирането на OBJ в бинарни glTF (GLB) е най-често срещаният уеб работен поток. GLB е самостоятелно съдържаща се двоична пакета: текстури, геометрия и метаданни в един файл, което го прави ефективен за HTTP доставка и директна зареждане от Three.js, Babylon.js и модел-вийър.

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 до ST L е просто, защото двата формата съхраняват триъгълни мешки.

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 не носи никаква информация за материал или текстура, резултатът от GSTF файл ще съдържа само геометрия. можете да прикрепите материалите програмирано към сценичните възли след зареждане, ако е необходимо.

3MF to glTF (Manufacturing to Visualization)

3D Форматът за производство (3MF) се използва все повече в добавките на производствените работни потоци, защото съхранява цветове, материали, компонентни дървета и печат метаданни заедно с геометрията. Конвертирането на 3MФ към 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 вносител и износители класове съществуват, но форматът за автоматично откриване все още не е накърнена, така че файловете FB X не могат да бъдат заредени чрез scene.open().

За повече подробности за Scene, NodeMesh класове, използвани в тези примери, вижте референтните страници за класовете в тази документация.