Οι προγραμματιστές Node.js που εργάζονται με 3D περιεχόμενο συχνά χρειάζονται να μετατρέπουν μεταξύ μορφών: ένα εργαλείο σχεδίασης εξάγει OBJ, ένας web renderer απαιτεί GLB, ένας 3D εκτυπωτής χρειάζεται STL και μια γραμμή παραγωγής χρησιμοποιεί 3MF. Η διαχείριση αυτών των μετατροπών με ένα ενιαίο, συνεπές API μειώνει τον αριθμό των εξωτερικών εργαλείων σε μια γραμμή παραγωγής και διατηρεί τη λογική μετατροπής μέσα στον κώδικα της εφαρμογής, όπου μπορεί να δοκιμαστεί και να εκδοθεί.
Το @aspose/3d Το πακέτο (v24.12.0, άδεια MIT) παρέχει ένα API προτεραιότητας TypeScript για ανάγνωση και εγγραφή όλων των κύριων μορφών 3D στο Node.js. Αυτός ο οδηγός περνάει από τις πιο κοινές ροές εργασίας μετατροπής.
Εγκατάσταση
npm install @aspose/3d
Απαιτήσεις: Node.js 18, 20 ή 22· TypeScript 5.0 ή νεότερο. Η μόνη εξάρτηση χρόνου εκτέλεσης είναι xmldom.
Υποστηριζόμενες Μορφές
Ο παρακάτω πίνακας παραθέτει τις μορφές που καλύπτονται σε αυτόν τον οδηγό και την υποστήριξη ανάγνωσης/εγγραφής τους.
| Μορφή | Επέκταση | Ανάγνωση | Εγγραφή | Σημειώσεις |
|---|---|---|---|---|
| Wavefront OBJ | .obj | Ναι | Ναι | Διαβάζει/γράφει .mtl αρχεία υλικού |
| glTF 2.0 (JSON) | .gltf | Ναι | Ναι | Τυπική μορφή παράδοσης ιστού |
| glTF 2.0 (Δυαδικό) | .glb | Ναι | Ναι | Αυτοσυνεπές, προτιμώμενο για το web |
| STL (ASCII/Δυαδικό) | .stl | Ναι | Ναι | Τυπική μορφή 3D εκτύπωσης |
| 3MF | .3mf | Ναι | Ναι | Μορφή κατασκευής με πλούσια μεταδεδομένα |
| FBX | .fbx | Όχι* | Όχι* | Ο Importer/exporter υπάρχει, αλλά η αυτόματη ανίχνευση μορφής δεν είναι συνδεδεμένη· δεν είναι χρησιμοποιήσιμος μέσω scene.open() |
| COLLADA | .dae | Ναι | Ναι | Μορφή ανταλλαγής βασισμένη σε XML |
Το OBJ υποστηρίζει τόσο εισαγωγή όσο και εξαγωγή. Φορτώστε με scene.open() και αποθηκεύστε με scene.save('output.obj'), ή μετατρέψτε σε οποιαδήποτε άλλη υποστηριζόμενη μορφή όπως glTF, STL ή 3MF.
OBJ σε GLB (Παράδοση στο Web)
Η μετατροπή OBJ σε δυαδικό glTF (GLB) είναι η πιο κοινή διαδικασία στο web. Το GLB είναι ένα αυτόνομο δυαδικό πακέτο: υφές, γεωμετρία και μεταδεδομένα σε ένα μόνο αρχείο, κάτι που το καθιστά αποδοτικό για παράδοση μέσω HTTP και άμεση φόρτωση από Three.js, Babylon.js και 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');
Η μορφή εξόδου προκύπτει από την επέκταση του αρχείου. Χρησιμοποιήστε .glb για δυαδικό GLB ή .gltf για το ξεχωριστό JSON + .bin διάταξη.
OBJ σε STL (Προετοιμασία για 3D Εκτύπωση)
Το STL είναι η κοινή γλώσσα των εκτυπώσεων FDM και SLA 3D. Τα slicer όπως PrusaSlicer, Bambu Studio και Chitubox δέχονται όλα STL. Η μετατροπή από OBJ σε STL είναι απλή, επειδή και οι δύο μορφές αποθηκεύουν τριγωνικά πλέγματα.
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 δεν αποθηκεύει χρώμα, υλικό ή δεδομένα UV. Εάν το αρχείο OBJ σας χρησιμοποιεί ομάδες υλικών, αυτές οι πληροφορίες απορρίπτονται κατά την εξαγωγή. Για μορφές εκτύπωσης που διατηρούν το χρώμα, σκεφτείτε το 3MF αντί αυτού (δείτε παρακάτω).
STL σε glTF (Σαρωτής και CAD στο Web)
Οι σαρωτές δομημένου φωτός και οι εξαγωγείς παραμετρικού CAD συνήθως παράγουν STL. Η μετατροπή σε glTF καθιστά τη γεωμετρία προσβάσιμη σε προβολείς βασισμένους στο web και σε πλατφόρμες AR χωρίς βήμα απόδοσης στην πλευρά του διακομιστή.
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 δεν περιέχει πληροφορίες υλικού ή υφής, το προκύπτον glTF αρχείο θα περιέχει μόνο γεωμετρία. Μπορείτε να προσθέσετε υλικά προγραμματιστικά στους κόμβους της σκηνής μετά τη φόρτωση, εάν χρειάζεται.
3MF to glTF (Manufacturing to Visualization)
Η μορφή 3D Manufacturing (3MF) χρησιμοποιείται όλο και περισσότερο σε ροές εργασίας προσθετικής κατασκευής επειδή αποθηκεύει χρώμα, υλικά, δέντρα εξαρτημάτων και μεταδεδομένα εκτύπωσης μαζί με τη γεωμετρία. Η μετατροπή του 3MF σε glTF επιτρέπει την επακόλουθη οπτικοποίηση σε εργαλεία web ενώ διατηρεί τη δομή της σκηνής.
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() διατηρεί την ιεραρχία των στοιχείων στο scene.rootNode.childNodes, ώστε να μπορείτε να ελέγξετε ή να χειριστείτε μεμονωμένα μέρη πριν από την αποθήκευση.
Μοτίβο Μαζικής Μετατροπής
Κατά την επεξεργασία ενός καταλόγου αρχείων, τυλίξτε κάθε μετατροπή σε ένα try/catch ώστε ένα μόνο κατεστραμμένο αρχείο να μην διακόψει ολόκληρη τη δέσμη.
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');
Το παραπάνω μοτίβο διαβάζει κάθε υποστηριζόμενη επέκταση αρχείου από έναν κατάλογο εισόδου, μετατρέπει σε GLB και καταγράφει τυχόν αποτυχίες χωρίς να διακόπτει τον βρόχο. Ο επιστρεφόμενος πίνακας των ConversionResult αντικειμένων μπορεί να χρησιμοποιηθεί για αναφορές ή λογική επανάληψης.
Συμπέρασμα
@aspose/3d καλύπτει το πλήρες φάσμα των αναγκών μετατροπής μορφών σε μια εφαρμογή Node.js TypeScript με συνεπή API δύο βημάτων: scene.open() για φόρτωση, scene.save() για εγγραφή. Ο βασικός περιορισμός που πρέπει να θυμάστε είναι ότι οι κλάσεις εισαγωγέα και εξαγωγέα FBX υπάρχουν, αλλά η αυτόματη ανίχνευση μορφής δεν είναι ακόμη ενεργοποιημένη, έτσι τα αρχεία FBX δεν μπορούν να φορτωθούν μέσω scene.open().
Για περισσότερες λεπτομέρειες σχετικά με το Scene, Node, και Mesh κλάσεις που χρησιμοποιούνται σε αυτά τα παραδείγματα, δείτε τις σελίδες αναφοράς κλάσεων σε αυτήν την τεκμηρίωση.