Node.js geliştiricileri 3D içerikle çalışırken sık sık formatlar arasında dönüştürme yapma ihtiyacı duyar: bir tasarım aracı OBJ dışa aktarır, bir web renderleyicisi GLB bekler, bir 3D yazıcı STL ister ve bir üretim hattı 3MF kullanır. Bu dönüşümleri tek, tutarlı bir API ile yönetmek, bir pipeline’daki harici araç sayısını azaltır ve dönüşüm mantığını uygulama kodu içinde tutar; böylece test edilebilir ve sürümlendirilebilir.

Bu @aspose/3d paket (v24.12.0, MIT lisansı) Node.js’te tüm büyük 3D formatlarını okuma ve yazma için TypeScript-öncelikli bir API sağlar. Bu kılavuz, en yaygın dönüşüm iş akışlarını adım adım gösterir.

Kurulum

npm install @aspose/3d

Gereksinimler: Node.js 18, 20 veya 22; TypeScript 5.0 veya daha yeni. Tek çalışma zamanı bağımlılığı şudur: xmldom.

Desteklenen Biçimler

Aşağıdaki tablo, bu kılavuzda ele alınan formatları ve okuma/yazma desteklerini listeler.

BiçimUzantıOkuYazNotlar
Wavefront OBJ.objEvetHayırSadece içe aktar; okur .mtl malzeme dosyaları
glTF 2.0 (JSON).gltfEvetEvetStandart web teslim formatı
glTF 2.0 (Binary).glbEvetEvetKendine yeterli, web için tercih edilen
STL (ASCII/Binary).stlEvetEvetStandart 3D baskı formatı
3MF.3mfEvetEvetZengin meta veriye sahip üretim formatı
FBX.fbxHayır*Hayır*Importer/exporter mevcut ancak format otomatik algılama bağlanmadı; üzerinden kullanılamaz scene.open()
COLLADA.daeEvetEvetXML tabanlı değişim formatı

Not: OBJ yalnızca içe aktarım içindir (canExport: false). OBJ içeriğini başka bir formata dönüştürmek için, şununla yükleyin scene.open() ve glTF, STL veya 3MF gibi desteklenen bir ihracat formatına kaydedin.

OBJ’den GLB’ye (Web Dağıtımı)

OBJ’yi ikili glTF (GLB)‘ye dönüştürmek en yaygın web iş akışıdır. GLB, tek bir dosyada doku, geometri ve meta verileri barındıran bağımsız bir ikili pakettir; bu da HTTP üzerinden dağıtım ve Three.js, Babylon.js ve model-viewer tarafından doğrudan yükleme için verimlidir.

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

Çıktı formatı dosya uzantısından çıkarılır. Kullan .glb ikili GLB için veya .gltf ayrı JSON + için .bin düzen.

OBJ’den STL’ye: 3B Baskı İçin Model Hazırlama

STL, FDM ve SLA 3D baskının ortak dili (lingua franca)‘dır. PrusaSlicer, Bambu Studio ve Chitubox gibi dilimleyiciler STL’yi kabul eder. OBJ’den STL’ye dönüştürme basittir çünkü her iki format da üçgen ağları depolar.

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 renk, malzeme veya UV verilerini depolamaz. OBJ dosyanız malzeme grupları kullanıyorsa, bu bilgiler dışa aktarım sırasında atılır. Renk koruyan baskı formatları için bunun yerine 3MF’yi düşünün (aşağıya bakın).

STL’den glTF’ye: Tarayıcı veya CAD Çıktısından Web’e

Yapılandırılmış ışık tarayıcıları ve parametrik CAD dışa aktarıcıları genellikle STL üretir. glTF’ye dönüştürmek, geometriyi sunucu tarafı render adımı olmadan web tabanlı görüntüleyiciler ve AR platformlarında erişilebilir kılar.

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, malzeme veya doku bilgisi içermediği için, ortaya çıkan glTF dosyası yalnızca geometri içerecektir. Gerekirse, yüklemeden sonra sahne düğümlerine programlı olarak malzemeler ekleyebilirsiniz.

3MF to glTF (Manufacturing to Visualization)

3D Üretim Formatı (3MF), renk, malzemeler, bileşen ağaçları ve baskı meta verilerini geometriyle birlikte depoladığı için eklemeli imalat iş akışlarında giderek daha fazla kullanılmaktadır. 3MF’yi glTF’ye dönüştürmek, sahne yapısını korurken web araçlarında sonraki görselleştirmeyi mümkün kılar.

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() bileşen hiyerarşisini korur scene.rootNode.childNodes, böylece kaydetmeden önce bireysel parçaları inceleyebilir veya manipüle edebilirsiniz.

Toplu Dönüştürme Deseni

Dosyalar dizinini işlerken, her dönüşümü bir try/catch böylece tek bir bozuk dosya tüm toplu işlemi iptal etmez.

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

Yukarıdaki desen, bir giriş dizininden desteklenen her dosya uzantısını okur, GLB’ye dönüştürür ve döngüyü durdurmadan herhangi bir hatayı kaydeder. Döndürülen dizi ConversionResult nesneler raporlama veya yeniden deneme mantığı için kullanılabilir.

Sonuç

@aspose/3d Node.js TypeScript uygulamasında format dönüşüm ihtiyaçlarının tam kapsamını tutarlı iki adımlı bir API ile kapsar: scene.open() yüklemek için, scene.save() yazmak için. Hatırlanması gereken temel kısıtlama, FBX içe aktarıcı ve dışa aktarıcı sınıflarının mevcut olması ancak format otomatik algılamasının henüz bağlanmamış olmasıdır, bu yüzden FBX dosyaları üzerinden yüklenemez scene.open().

Daha fazla ayrıntı için Scene, Node, ve Mesh bu örneklerde kullanılan sınıflar için, bu belgede sınıf referans sayfalarına bakın.