Node.js kūrėjams, dirbantiems su 3D turiniu, dažnai reikia konvertuoti tarp formatų: projektavimo įrankis eksportuoja OBJ, žiniatinklio rendereris tikisi GLB, 3D spausdintuvas reikalauja STL, o gamybos pipeline naudoja 3MF. Šių konversijų tvarkymas naudojant vieną nuoseklią API sumažina išorinių įrankių skaičių pipeline’e ir leidžia konversijos logiką laikyti programos kode, kur ją galima testuoti ir versijuoti.
Šis @aspose/3d paketas (v24.12.0, MIT licencija) suteikia TypeScript‑pirmą API skaityti ir rašyti visus pagrindinius 3D formatus Node.js aplinkoje. Ši vadovas supažindina su dažniausiai pasitaikančiais konvertavimo darbo srautais.
Įdiegimas
npm install @aspose/3d
Reikalavimai: Node.js 18, 20 arba 22; TypeScript 5.0 arba vėlesnė versija. Vienintelė vykdymo laiko priklausomybė yra xmldom.
Palaikomi formatai
Žemiau pateikta lentelė išvardija šiame vadove aptariamus formatus ir jų skaitymo/rašymo palaikymą.
| Formatas | Plėtinys | Skaityti | Rašyti | Pastabos |
|---|---|---|---|---|
| Wavefront OBJ | .obj | Taip | Ne | Tik importavimas; skaito .mtl medžiagų failus |
| glTF 2.0 (JSON) | .gltf | Taip | Taip | Standartinis žiniatinklio pristatymo formatas |
| glTF 2.0 (Dvejetainis) | .glb | Taip | Taip | Savarankiškas, pageidautinas žiniatinkliui |
| STL (ASCII/Binary) | .stl | Taip | Taip | Standartinis 3D spausdinimo formatas |
| 3MF | .3mf | Taip | Taip | Gamybos formatas su turtingais metaduomenimis |
| FBX | .fbx | Ne* | Ne* | Importuotojas/eksportuotojas egzistuoja, bet formato automatinis aptikimas nėra sujungtas; nepasiekiamas per scene.open() |
| COLLADA | .dae | Taip | Taip | XML pagrindu veikiantis mainų formatas |
Pastaba: OBJ yra tik importuojamas (canExport: false). Norint konvertuoti OBJ turinį į kitą formatą, įkelkite jį su scene.open() ir išsaugokite į palaikomą eksporto formatą, pvz., glTF, STL arba 3MF.
OBJ į GLB (žiniatinklio pristatymas)
OBJ konvertavimas į binarinį glTF (GLB) yra dažniausias žiniatinklio darbo procesas. GLB yra savarankiškas binarinis paketas: tekstūros, geometrija ir metaduomenys viename faile, todėl jis yra efektyvus HTTP pristatymui ir tiesioginiam įkėlimui Three.js, Babylon.js ir 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');
Išvesties formatas nustatomas pagal failo plėtinį. Naudokite .glb binary GLB arba .gltf atskiram JSON + .bin išdėstymas.
OBJ į STL: Modelio paruošimas 3D spausdinimui
STL yra bendroji kalba FDM ir SLA 3D spausdinimui. Sliceriai, tokie kaip PrusaSlicer, Bambu Studio ir Chitubox, visi priima STL. Konvertavimas iš OBJ į STL yra paprastas, nes abu formatai saugo trikampių tinklus.
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 nesaugo spalvų, medžiagų ar UV duomenų. Jei jūsų OBJ faile naudojamos medžiagų grupės, ši informacija išmetama eksporto metu. Spalvas išsaugančių spausdinimo formatų atveju apsvarstykite 3MF (žr. žemiau).
STL į glTF: Nuo skenerio arba CAD išvesties iki žiniatinklio
Struktūruoto šviesos skeneriai ir parametriniai CAD eksportuotojai dažniausiai išveda STL. Konvertavimas į glTF leidžia geometriją pasiekti žiniatinklio peržiūros programose ir AR platformose be serverio pusės renderinimo žingsnio.
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');
Kadangi STL nenaudoja medžiagos ar tekstūros informacijos, gautas glTF failas turės tik geometriją. Jei reikia, medžiagas galite priskirti scenos mazgams programiškai po įkėlimo.
3MF to glTF (Manufacturing to Visualization)
3D gamybos formatas (3MF) vis dažniau naudojamas pridedamosios gamybos darbo srautų, nes jis saugo spalvą, medžiagas, komponentų medžius ir spausdinimo metaduomenis kartu su geometrija. Konvertavimas iš 3MF į glTF leidžia vėlesnę vizualizaciją žiniatinklio įrankiuose, išlaikant scenos struktūrą.
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() išlaiko komponentų hierarchiją scene.rootNode.childNodes, todėl galite peržiūrėti arba manipuliuoti atskirais dalimis prieš išsaugodami.
Masinio konvertavimo šablonas
Apdorojant failų katalogą, supakuokite kiekvieną konversiją į try/catch kad vienas sugadintas failas nepertrauktų viso paketo.
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');
Aukščiau pateiktas šablonas nuskaito kiekvieną palaikomą failo plėtinį iš įvesties katalogo, konvertuoja į GLB ir registruoja bet kokius nesėkmes nesustabdydamas ciklo. Grąžintas masyvas ConversionResult objektų gali būti naudojami ataskaitoms arba pakartotiniam bandymui.
Išvada
@aspose/3d apima visą formatų konversijos poreikių spektrą Node.js TypeScript programoje su nuosekliu dviejų žingsnių API: scene.open() įkelti, scene.save() rašyti. Pagrindinis apribojimas, kurį reikia prisiminti, yra tas, kad FBX importavimo ir eksportavimo klasės egzistuoja, tačiau formato automatinis aptikimas dar neįgyvendintas, todėl FBX failų negalima įkelti per scene.open().
Daugiau informacijos apie Scene, Node, ir Mesh klasės, naudojamos šiuose pavyzdžiuose, žiūrėkite klasės nuorodų puslapius šioje dokumentacijoje.