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 konvejeris naudoja 3MF. Šių konversijų tvarkymas naudojant vieną nuoseklią API sumažina išorinių įrankių skaičių konvejeryje 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 nagrinėjamus formatus ir jų skaitymo/rašymo palaikymą.
| Formatas | Plėtinys | Skaityti | Rašyti | Pastabos |
|---|---|---|---|---|
| Wavefront OBJ | .obj | Taip | Taip | Skaito/rašo .mtl medžiagų failai |
| glTF 2.0 (JSON) | .gltf | Taip | Taip | Standartinis žiniatinklio pristatymo formatas |
| glTF 2.0 (binariškas) | .glb | Taip | Taip | Savarankiškas, rekomenduojamas žiniatinkliui |
| STL (ASCII/Binary) | .stl | Taip | Taip | Standartinis 3D spausdinimo formatas |
| 3MF | .3mf | Taip | Taip | Gamybos formatas su gausiais 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 |
OBJ palaiko tiek importą, tiek eksportą. Įkelti su scene.open() ir išsaugoti su scene.save('output.obj'), arba konvertuoti į bet kurį kitą palaikomą 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 (3D spausdinimo paruošimas)
STL yra bendroji kalba FDM ir SLA 3D spausdinimui. Sluoksnių generatoriai, 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š eksporto pašalinama. Spalvas išsaugojančiais spausdinimo formatais apsvarstykite 3MF (žr. žemiau).
STL į glTF (skenerio ir CAD į žiniatinklį)
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 neturi medžiagų ar tekstūrų informacijos, gautas glTF failas turės tik geometriją. Jei reikia, po įkėlimo galite programiškai priskirti medžiagas scenos mazgams.
3MF to glTF (Manufacturing to Visualization)
3D gamybos formatas (3MF) vis dažniau naudojamas pridedamosios gamybos darbo srautų metu, nes jis saugo spalvą, medžiagas, komponentų medžius ir spausdinimo metaduomenis kartu su geometrija. 3MF konvertavimas į 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 ne nutrauktų visos partijos.
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 skaito 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 formatų 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.