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. Upravljanje ovim konverzijama pomoću jedinstvenog, doslednog API‑ja smanjuje broj eksternih alata u pipeline‑u i održava logiku konverzije unutar koda aplikacije gde se može testirati i verzionisati.

The @aspose/3d Paket (v24.12.0, MIT licenca) pruža TypeScript‑prvi 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ČitanjePisanjeNapomene
Wavefront OBJ.objDaDaČita/piše .mtl datoteke materijala
glTF 2.0 (JSON).gltfDaDaStandardni format za isporuku na webu
glTF 2.0 (Binary).glbDaDaSamostalno, preporučeno za web
STL (ASCII/Binary).stlDaDaStandardni format za 3D štampu
3MF.3mfDaDaProizvodni format sa bogatim metapodacima
FBX.fbxNe*Ne*Postoji uvoznik/izvoznik, ali automatsko otkrivanje formata nije povezano; nije upotrebljivo putem scene.open()
COLLADA.daeDaDaXML‑bazirani format razmene

OBJ podržava i uvoz i izvoz. Učitajte pomoću scene.open() i sačuvajte pomoću scene.save('output.obj'), ili konvertujte u bilo koji drugi podržani format, 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.

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 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 odbacuju prilikom izvoza. Za formate štampe koji očuvavaju boju, razmotrite 3MF (vidi dole).

STL u glTF (Skener i CAD za 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 nosi informacije o materijalu ili teksturi, rezultatni glTF fajl će sadržati samo geometriju. Po potrebi možete programatski prikačiti materijale čvorovima scene nakon učitavanja.

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.

Obrazac za grupnu konverziju

Kada obrađujete direktorijum fajlova, umotajte svaku konverziju u try/catch tako da jedan oštećen fajl ne prekine čitavu 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');

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

Zaključak

@aspose/3d pokriva čitav 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. Ključno ograničenje koje treba zapamtiti je da klase za uvoz i izvoz FBX‑a postoje, ali automatsko otkrivanje formata još nije povezano, pa FBX fajlovi ne mogu biti učitani putem scene.open().

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