Node.js programeri koji rade sa 3D sadržajem često moraju da konvertuju između formata: alat za dizajn izvozi OBJ, web rendereri očekuju GLB, 3D štampač zahteva STL, a proizvodna linija koristi 3MF. Obrada ovih konverzija pomoću jedinstvenog, doslednog API‑ja smanjuje broj eksternih alata u pipeline‑u i čuva logiku konverzije unutar koda aplikacije gde se može testirati i verzionisati.

The @aspose/3d paket (v24.12.0, MIT licenca) pruža TypeScript‑first API za čitanje i pisanje svih glavnih 3D formata u Node.js. Ovaj vodič prolazi kroz najčešće radne tokove konverzije.

Instalacija

npm install @aspose/3d

Zahtevi: Node.js 18, 20 ili 22; TypeScript 5.0 ili noviji. Jedina runtime zavisnost je xmldom.

Podržani formati

Tabela ispod navodi formate obuhvaćene u ovom vodiču i njihovu podršku za čitanje/pisanje.

FormatEkstenzijaČitajMolim vasNapomene
Wavefront OBJ.objDaNeSamo uvoz; čita .mtl datoteke materijala
glTF 2.0 (JSON).gltfDaDaStandardni format za isporuku na webu
glTF 2.0 (binarni).glbDaDaSamostalno, preporučeno za web
STL (ASCII/Binarni).stlDaDaStandardni format za 3D štampu
3MF.3mfDaDaProizvodni format sa bogatim metapodacima
FBX.fbxNe*Ne*Postoji uvoz/izvoz, ali automatsko otkrivanje formata nije povezano; nije upotrebljivo putem scene.open()
COLLADA.daeDaDaXML‑bazirani format razmene

Napomena: OBJ je samo za uvoz (canExport: false). Da biste konvertovali OBJ sadržaj u drugi format, učitajte ga pomoću scene.open() i sačuvajte u podržanom formatu za izvoz, kao što su glTF, STL ili 3MF.

OBJ u GLB (Web isporuka)

Konvertovanje OBJ u binarni glTF (GLB) je najčešći web radni tok. GLB je samostalni binarni paket: teksture, geometrija i metapodaci u jednom fajlu, što ga čini efikasnim za HTTP isporuku i direktno učitavanje od strane Three.js, Babylon.js i model-viewer‑a.

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

Izlazni format se zaključuje iz ekstenzije fajla. Koristite .glb za binarni GLB ili .gltf za odvojeni JSON + .bin raspored.

OBJ u STL: Priprema modela za 3D štampu

STL je lingua franca FDM i SLA 3D štampe. Slicer‑i poput PrusaSlicer, Bambu Studio i Chitubox prihvataju STL. Konvertovanje iz OBJ u STL je jednostavno jer oba formata čuvaju trouglaste mreže.

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 ne čuva boju, materijal ili UV podatke. Ako vaš OBJ fajl koristi grupe materijala, te informacije se gube prilikom izvoza. Za formate štampe koji očuvavaju boju, razmotrite 3MF (vidi ispod).

STL u glTF: Sa skenera ili CAD izlaza na web

Skeneri sa strukturiranim svetlom i parametarski CAD eksporteri najčešće proizvode STL. Konvertovanje u glTF čini geometriju dostupnom u web‑baziranim preglednicima i AR platformama bez koraka renderovanja na serveru.

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

Pošto STL ne sadrži informacije o materijalu ili teksturi, rezultatni glTF fajl će sadržati samo geometriju. Možete programatski prikačiti materijale čvorovima scene nakon učitavanja, ako je potrebno.

3MF to glTF (Manufacturing to Visualization)

3D Manufacturing Format (3MF) sve se više koristi u radnim tokovima aditivne proizvodnje jer čuva boju, materijale, hijerarhiju komponenti i metapodatke štampe uz geometriju. Konvertovanje 3MF u glTF omogućava naknadnu vizualizaciju u web alatima uz očuvanje strukture scene.

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() čuva hijerarhiju komponenti u scene.rootNode.childNodes, tako da možete pregledati ili manipulisati pojedinačnim delovima pre nego što ih sačuvate.

Grupna konverzija

Kada obrađujete direktorijum fajlova, umotajte svaku konverziju u try/catch tako da jedan oštećen fajl ne prekine celu seriju.

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

Šablon iznad čita svaku podržanu ekstenziju fajla iz ulaznog direktorijuma, konvertuje u GLB i beleži sve greške bez zaustavljanja petlje. Vraćeni niz ConversionResult objekata može se koristiti za izveštavanje ili logiku ponovnog pokušaja.

Zaključak

@aspose/3d pokriva kompletan spektar potreba za konverzijom formata u Node.js TypeScript aplikaciji sa doslednim dvo‑korakom API‑ja: scene.open() za učitavanje, scene.save() za pisanje. scene.open().

Za više detalja o Scene, Node, i Mesh klasama korišćenim u ovim primerima, pogledajte stranice referenci klasa u ovoj dokumentaciji.