Οι προγραμματιστές Node.js που εργάζονται με 3Δ περιεχόμενο συχνά χρειάζονται να μετατρέπουν μεταξύ μορφών: ένα εργαλείο σχεδίασης εξάγει OBJ, ένας web renderer απαιτεί GLB, ένας 3Δ εκτυπωτής χρειάζεται STL, και μια γραμμή παραγωγής χρησιμοποιεί 3MF. Η διαχείριση αυτών των μετατροπών με ένα ενιαίο, συνεπές API μειώνει τον αριθμό των εξωτερικών εργαλείων σε μια γραμμή εργασίας και διατηρεί τη λογική μετατροπής μέσα στον κώδικα της εφαρμογής, όπου μπορεί να δοκιμαστεί και να εκδοθεί.
Το @aspose/3d Το πακέτο (v24.12.0, άδεια MIT) παρέχει ένα TypeScript-first API για ανάγνωση και εγγραφή όλων των κύριων μορφών 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 (Binary) | .glb | Ναι | Ναι | Αυτοσυμπεριλαμβανόμενο, προτιμάται για το web |
| STL (ASCII/Δυαδικό) | .stl | Ναι | Ναι | Τυπική μορφή 3D εκτύπωσης |
| 3MF | .3mf | Ναι | Ναι | Μορφή κατασκευής με πλούσια μεταδεδομένα |
| FBX | .fbx | Όχι* | Όχι* | Ο Importer/exporter υπάρχει, αλλά η αυτόματη ανίχνευση μορφής δεν είναι συνδεδεμένη· δεν είναι χρησιμοποιήσιμος μέσω scene.open() |
| COLLADA | .dae | Ναι | Ναι | Μορφή ανταλλαγής βασισμένη σε XML |
Σημείωση: OBJ είναι μόνο για εισαγωγή (canExport: false). Για να μετατρέψετε το περιεχόμενο OBJ σε άλλη μορφή, φορτώστε το με scene.open() και αποθηκεύστε το σε μια υποστηριζόμενη μορφή εξαγωγής όπως 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: Προετοιμασία μοντέλου για 3Δ εκτύπωση
Το 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 επιτρέπει την επακόλουθη οπτικοποίηση σε διαδικτυακά εργαλεία διατηρώντας τη δομή της σκηνής.
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 κλάσεις που χρησιμοποιούνται σε αυτά τα παραδείγματα, δείτε τις σελίδες αναφοράς κλάσεων σε αυτήν την τεκμηρίωση.