Node.js izstrādātāji, kas strādā ar 3D saturu, bieži vien ir jāveic formātu konvertēšana: dizaina rīks eksportē OBJ, tīmekļa renderētājs gaida GLB, 3D printeris pieprasa STL, un ražošanas cauruļvads izmanto 3MF. Šo konvertāciju apstrāde ar vienotu, konsekventu API samazina ārējo rīku skaitu cauruļvādā un ļauj konvertēšanas loģiku uzturēt lietojumprogrammas kodā, kur to var testēt un versijot.
Šis @aspose/3d pakotne (v24.12.0, MIT license) nodrošina TypeScript-first API, lai lasītu un rakstītu visus galvenos 3D formātus Node.js vidē. Šis ceļvedis izskaidro visizplatītākās konvertēšanas darba plūsmas.
Instalēšana
npm install @aspose/3d
Prasības: Node.js 18, 20 vai 22; TypeScript 5.0 vai jaunāks. Vienīgā izpildlaika atkarība ir xmldom.
Atbalstītie formāti
Zemāk esošā tabula uzskaita šajā ceļvedī aplūkotos formātus un to lasīšanas/rakstīšanas atbalstu.
| Formāts | Paplašinājums | Lasīt | Rakstīt | Piezīmes |
|---|---|---|---|---|
| Wavefront OBJ | .obj | Jā | Jā | Lasīt/rakstīt .mtl materiālu faili |
| glTF 2.0 (JSON) | .gltf | Jā | Jā | Standarta tīmekļa piegādes formāts |
| glTF 2.0 (Binārs) | .glb | Jā | Jā | Pašpietiekams, priekšroka tīmeklim |
| STL (ASCII/Binary) | .stl | Jā | Jā | Standarta 3D drukāšanas formāts |
| 3MF | .3mf | Jā | Jā | Ražošanas formāts ar bagātīgiem metadatiem |
| FBX | .fbx | Nē* | Nē* | Importer/exporter pastāv, bet formāta automātiskā noteikšana nav savienota; nav lietojams caur scene.open() |
| COLLADA | .dae | Jā | Jā | XML balstīts apmaiņas formāts |
OBJ atbalsta gan importu, gan eksportu. Ielādēt ar scene.open() un saglabāt ar scene.save('output.obj'), vai konvertēt uz jebkuru citu atbalstītu formātu, piemēram, glTF, STL vai 3MF.
OBJ uz GLB (tīmekļa piegāde)
OBJ konvertēšana uz bināro glTF (GLB) ir visizplatītākā tīmekļa darbplūsma. GLB ir pašpietiekama binārā pakotne: tekstūras, ģeometrija un metadati vienā failā, kas padara to efektīvu HTTP piegādei un tiešai ielādei ar Three.js, Babylon.js un 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');
Izvades formāts tiek noteikts no faila paplašinājuma. Izmantojiet .glb bināram GLB vai .gltf atsevišķam JSON + .bin izkārtojums.
OBJ uz STL (3D drukāšanas sagatavošana)
STL ir kopējā valoda FDM un SLA 3D drukāšanai. Sliceri, piemēram, PrusaSlicer, Bambu Studio un Chitubox, visi pieņem STL. Konvertēšana no OBJ uz STL ir vienkārša, jo abi formāti glabā trīsstūra tīklu.
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 nesaglabā krāsu, materiālu vai UV datus. Ja jūsu OBJ fails izmanto materiālu grupas, šī informācija tiek izlaista eksportēšanas laikā. Krāsu saglabājošiem drukas formātiem apsveriet 3MF (skatiet zemāk).
STL uz glTF (skeneris un CAD uz tīmekli)
Strukturētas gaismas skeneri un parametriskie CAD eksportieri parasti izvada STL. Konvertēšana uz glTF ļauj ģeometriju izmantot tīmekļa skatītājos un AR platformās bez servera puses renderēšanas posma.
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');
Tā kā STL nesatur materiālu vai tekstūru informāciju, rezultējošais glTF fails saturēs tikai ģeometriju. Ja nepieciešams, pēc ielādes varat programmatiski pievienot materiālus ainas mezgliem.
3MF to glTF (Manufacturing to Visualization)
3D ražošanas formāts (3MF) arvien vairāk tiek izmantots pievienošanas ražošanas darbplūsmās, jo tas saglabā krāsu, materiālus, komponentu koku un drukas metadatus kopā ar ģeometriju. Pārvēršana no 3MF uz glTF ļauj veikt turpmāku vizualizāciju tīmekļa rīkos, saglabājot ainas struktūru.
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() saglabā komponentu hierarhiju iekš scene.rootNode.childNodes, tāpēc jūs varat pārbaudīt vai manipulēt ar atsevišķām daļām pirms saglabāšanas.
Masveida konvertēšanas paraugs
Apstrādājot failu direktoriju, katru konversiju iesaiņojiet iekš try/catch lai viens bojāts fails neapturētu visu paketi.
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');
Iepriekšējais paraugs lasa katru atbalstīto faila paplašinājumu no ievades direktorijas, konvertē uz GLB un reģistrē jebkādas kļūdas, nepārtraucot ciklu. Atgrieztais masīvs no ConversionResult objektu var izmantot atskaitēm vai atkārtotas mēģinājuma loģikai.
Secinājums
@aspose/3d aptver visu formāta konversijas vajadzību spektru Node.js TypeScript lietojumprogrammā ar konsekventu divpakāpju API: scene.open() ielādēšanai, scene.save() rakstīšanai. Galvenais ierobežojums, ko jāatceras, ir tas, ka FBX importētāja un eksportētāja klases pastāv, bet formāta automātiskā noteikšana vēl nav integrēta, tāpēc FBX failus nevar ielādēt caur scene.open().
Lai iegūtu vairāk informācijas par Scene, Node, un Mesh klasēm, kas izmantotas šajos piemēros, skatiet klašu atsauču lapas šajā dokumentācijā.