Πώς να εξάγετε 3D σκηνές σε glTF/GLB με TypeScript
Το Aspose.3D FOSS υποστηρίζει το glTF 2.0 τόσο ως μορφή εισαγωγής όσο και εξαγωγής. Το ίδιο αντικείμενο Scene μπορεί να γεμίσει από ένα αρχείο OBJ, FBX, STL ή άλλο πηγαίο αρχείο και στη συνέχεια να γραφτεί σε .gltf (JSON + εξωτερικό δυαδικό) ή .glb (μονό δυαδικό κοντέινερ) ορίζοντας μία σημαία στο GltfSaveOptions.
Οδηγός βήμα-βήμα
Βήμα 1: Εγκατάσταση @aspose/3d
npm install @aspose/3dΕπιβεβαιώστε ότι το Node.js 18 ή νεότερο είναι ενεργό:
node --version # must be >= 16.0.0Βήμα 2: Εισαγωγή Scene, GltfSaveOptions και GltfFormat
import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';GltfFormat είναι ο περιγραφέας μορφής που περνάει στο scene.save(). GltfSaveOptions μεταφέρει όλες τις ρυθμίσεις εξαγωγής.
Εάν φορτώνετε επίσης ένα αρχείο προέλευσης (π.χ., OBJ), εισάγετε τις αντίστοιχες επιλογές φόρτωσης:
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Βήμα 3: Δημιουργία ή φόρτωση σκηνής
Επιλογή A: Φόρτωση από υπάρχον αρχείο (μετατροπή OBJ → GLB):
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());Επιλογή B: Δημιουργία μιας ελάχιστης σκηνής προγραμματιστικά:
import { Scene, Node, Mesh } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
const childNode = new Node('cube');
scene.rootNode.addChildNode(childNode);
// Attach geometry to childNode as needed
Βήμα 4: Διαμόρφωση GltfSaveOptions
GltfSaveOptions ελέγχει τη μορφή εξόδου και τις λεπτομέρειες κωδικοποίησης.
const saveOpts = new GltfSaveOptions();
// Set to true for a single binary .glb file
// Set to false (default) for JSON .gltf + separate .bin
saveOpts.binaryMode = true;Πρόσθετες επιλογές που μπορείτε να ορίσετε:
| Ιδιότητα | Τύπος | Προεπιλογή | Επίδραση |
|---|---|---|---|
binaryMode | boolean | false | true → GLB, false → glTF JSON |
flipTexCoordV | boolean | true | Αναστροφή του κατακόρυφου άξονα UV για συμβατότητα με τη μηχανή |
Βήμα 5: Αποθήκευση χρησιμοποιώντας scene.save()
Περάστε τη διαδρομή εξόδου, τον περιγραφέα GltfFormat και τις ρυθμισμένες επιλογές:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
const saveOpts = new GltfSaveOptions();
saveOpts.binaryMode = true; // produce .glb
scene.save('output.glb', GltfFormat.getInstance(), saveOpts);
console.log('Converted to GLB successfully');Για να δημιουργήσετε ένα αρχείο JSON .gltf αντί για αυτό:
saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');Βήμα 6: Επαλήθευση του αρχείου εξόδου
Ελέγξτε ότι το αρχείο εξόδου υπάρχει και έχει μη μηδενικό μέγεθος:
import * as fs from 'fs';
const outputPath = 'output.glb';
const stats = fs.statSync(outputPath);
console.log(`Output file size: ${stats.size} bytes`);
if (stats.size === 0) {
throw new Error('Export produced an empty file: check scene content');
}Για επαλήθευση κυκλικής μεταφοράς, φορτώστε ξανά το GLB και ελέγξτε τον αριθμό των κόμβων:
import { Scene } from '@aspose/3d';
import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
const verify = new Scene();
verify.open('output.glb', new GltfLoadOptions());
let nodeCount = 0;
function countNodes(node: any): void {
nodeCount++;
for (const child of node.childNodes) countNodes(child);
}
countNodes(verify.rootNode);
console.log(`Round-trip verification: ${nodeCount} node(s) in output`);Κοινά προβλήματα και διορθώσεις
OBJ material file not found after export
When saving to OBJ via scene.save('output.obj'), the .mtl material file is written alongside the .obj file automatically. Ensure the output directory is writable and that both files are kept together.
Output .glb is smaller than expected / meshes are missing
Αν η φορτωμένη σκηνή έχει κόμβους χωρίς οντότητες (π.χ., κενές ομάδες από ένα OBJ), το GLB δεν θα περιέχει τη γεωμετρία αυτών των κόμβων. Επιβεβαιώστε ότι το αρχείο εισόδου περιέχει πραγματικά δεδομένα πολυγώνων χρησιμοποιώντας mesh.controlPoints.length > 0 πριν από την αποθήκευση.
Cannot find module ‘@aspose/3d/formats/gltf’
Βεβαιωθείτε ότι χρησιμοποιείτε Node.js 18+ και ότι @aspose/3d είναι εγκατεστημένο στην ίδια node_modules με το σημείο εισόδου σας. Εκτελέστε npm ls @aspose/3d για να επιβεβαιώσετε ότι η έκδοση είναι 24.12.0 ή νεότερη.
GltfFormat.getInstance() returns undefined
Αυτό υποδεικνύει ασυμφωνία εκδόσεων μεταξύ του κύριου @aspose/3d πακέτου και μιας αποθηκευμένης παλαιότερης έκδοσης. Διαγράψτε τα node_modules και package-lock.json, στη συνέχεια εκτελέστε ξανά το npm install.
Τα υφάσματα λείπουν στο παραγόμενο GLB
Βεβαιωθείτε ότι το binaryMode = true είναι ρυθμισμένο ώστε να παράγει ένα αυτόνομο GLB. Για έξοδο glTF JSON, τα αρχεία εικόνας των υφασμάτων πρέπει να είναι παρόντα δίπλα στο αρχείο εξόδου, καθώς αναφέρονται με σχετική διαδρομή.
Σφάλμα τύπου: Το όρισμα τύπου ‘GltfSaveOptions’ δεν είναι εκχωρήσιμο
Βεβαιωθείτε ότι τόσο το Scene όσο και το GltfSaveOptions έχουν εισαχθεί από την ίδια εγκατεστημένη έκδοση του πακέτου. Μικτές εγκαταστάσεις (global + local) μπορούν να προκαλέσουν ασυμφωνίες διεπαφής.
Συχνές Ερωτήσεις (FAQ)
Ποια είναι η διαφορά μεταξύ glTF και GLB?
glTF 2.0 JSON (.gltf) αποθηκεύει το γράφημα σκηνής ως ένα ανθρώπινα αναγνώσιμο αρχείο JSON με ξεχωριστούς .bin buffers και αρχεία εικόνας. GLB (.glb) συσκευάζει τα πάντα σε ένα ενιαίο δυαδικό κοντέινερ. Ορίστε binaryMode = true για GLB, false για JSON glTF.
Μπορώ να εξάγω μια σκηνή που δημιουργήθηκε εξ ολοκλήρου με κώδικα (χωρίς αρχείο πηγής);
Ναι. Δημιουργήστε ένα Scene, προσθέστε αντικείμενα Node, συνδέστε Mesh ή άλλες οντότητες, και στη συνέχεια καλέστε scene.save(). Η σκηνή δεν χρειάζεται να προέρχεται από ένα φορτωμένο αρχείο.
Είναι η εξαγωγή glTF χωρίς απώλειες;
Για γεωμετρία και μετασχηματισμούς, ναι. Τα υλικά αντιστοιχίζονται στις ιδιότητες υλικού PBR του glTF όπου είναι δυνατόν. Οι ιδιόκτητες επεκτάσεις υλικού FBX ενδέχεται να μην επαναλαμβάνονται τέλεια.
Μπορώ να εξάγω σε STL ή 3MF αντί αυτού;
Ναι. Το μοτίβο είναι ίδιο· εισάγετε τα αντίστοιχα *SaveOptions και *Format.getInstance():
import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);Εκτελείται το scene.save() ασύγχρονα;
Όχι. scene.save() είναι συγχρονισμένο. Τυλίξτε το σε νήμα εργασίας εάν χρειάζεται να αποφύγετε το μπλοκάρισμα του βρόχου γεγονότων κατά τις μεγάλες εξαγωγές.
Ποιες εκδόσεις του Node.js υποστηρίζονται; Node.js 18, 20 και 22+. Node.js 16 και παλαιότερες δεν υποστηρίζονται.