Πώς να εξάγετε 3D σκηνές σε glTF/GLB στο TypeScript

Πώς να εξάγετε 3D σκηνές σε glTF/GLB στο TypeScript

Το Aspose.3D FOSS υποστηρίζει το glTF 2.0 ως εισαγωγικό και εξαγωγητικό μορφότυπο. Scene Το αντικείμενο μπορεί να αποθηκευτεί από ένα OBJ, FBX, STL ή άλλο αρχείο πηγής και στη συνέχεια να γράφεται στο .gltf (JSON + εξωτερικό δυαδικό) ή .glb (Μια μονάδα δυαδικού δοχείου) με τη θέσπιση μιας σημαίας στο GltfSaveOptions.

Βήμα προς βήμα οδηγός

Βήμα 1: Εγκατάσταση @aspose/3d

asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.

Επιβεβαιώστε ότι το Node.js 18 ή αργότερα είναι ενεργό:

node --version   # must be >= 16.0.0

Βήμα 2: Εισαγωγή σκηνής, 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: Δημιουργήστε ή φορτώσετε μια σκηνή

Επιλογή Α: Κατεβάστε από ένα υπάρχον αρχείο (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());

Επιλογή Β: Δημιουργήστε μια ελάχιστη σκηνή προγραμματικά:

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: Ελέγξτε τις επιλογές GltfSave

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;

Επιπλέον επιλογές μπορείτε να ρυθμίσετε:

ΙδιοκτησίαΤύποςΥπολογισμοίΕΠΙΤΡΟΦΗ
binaryModebooleanfalsetrue → GLB, false Γκλτφ JSON
flipTexCoordVbooleantrueΦλιπ 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 μέσω scene.save('output.obj'), το .mtl Το αρχείο γράφεται μαζί με το .obj Φιλοποίηση αυτόματα. διασφαλίστε ότι το κατάλογο εξόδου είναι γραπτό και ότι τα δύο αρχεία αποθηκεύονται μαζί.

Η έκδοση .glb είναι μικρότερη από την αναμενόμενη / λείπουν τα μασέ Εάν η φορτωμένη σκηνή έχει κόμβους χωρίς οντότητες (π.χ., κενές ομάδες από ένα OBJ), το GLB δεν θα περιέχει τη γεωμετρία αυτών των κόμπων. mesh.controlPoints.length > 0 Πριν από την εξοικονόμηση.

Δεν μπορείτε να βρείτε το module ‘@aspose/3d/formats/gltf’ Βεβαιωθείτε ότι είστε στο Node.js 18+ και ότι @aspose/3d Εισάγεται στο ίδιο node_modules Σαν το σημείο εισόδου σας. τρέξει npm ls @aspose/3d Για να επιβεβαιωθεί η έκδοση είναι 24.12.0 ή αργότερα.

Η κ.Σακωβέλα (gr) επιστρέφει αόριστο Αυτό υποδεικνύει μια παρατυπία μεταξύ της κύριας εκδοχής. @aspose/3d πακέτο και κρυμμένη παλαιότερη έκδοση. διαγράψτε node_modules και package-lock.json,Στη συνέχεια τρέχει npm install και πάλι.

Οι υφιστάμενες ουσίες λείπουν στην παραγωγή GLB Ασφάλεια binaryMode = true Για την παραγωγή του GLTF JSON, τα αρχεία εικόνας κλωστοϋφαντουργίας πρέπει να είναι παρόντα δίπλα στο αρχείο παραγωγής, καθώς αναφέρονται από σχετικό μονοπάτι.

Ερμηνεία τύπου: Δεν επιτρέπεται η αναγνώριση του επιχειρήματος τύπος ‘GltfSaveOptions’ Βεβαιωθείτε και οι δύο Scene και GltfSaveOptions Οι μικτές εγκαταστάσεις (παγκόσμια + τοπική) μπορεί να προκαλέσουν παρεμβολές διεπαφής.

Συχνές ερωτήσεις (FAQ)

Ποια είναι η διαφορά μεταξύ GLTF και GLB;? Ηλεκτρονικό δίκτυο (.gltf) αποθηκεύει το γραφικό σκηνής ως ένα ανθρώπινο-διαβαστό αρχείο JSON με ξεχωριστή .bin Ηλεκτρονικό και Ετικέτες (Περίληψη).glb-Συμπληρώστε τα πάντα σε ένα μόνο δυαδικό δοχείο. binaryMode = true για την GLB, false Για το JSON GLTF.

Μπορώ να εξάγω μια σκηνή που έχει κατασκευαστεί εντελώς σε κώδικα (χωρίς αρχείο πηγής);? Δημιουργήστε ένα Scene,προσθέστε Node Ετικέτες, προσθήκη Mesh ή άλλες οντότητες, καλέστε scene.save().Η σκηνή δεν χρειάζεται να προέρχεται από ένα φορτισμένο αρχείο.

Η GST είναι απώλεια;? Για τη γεωμετρία και τις μετασχηματισμοί, ναι. Τα υλικά χαρτογραφούνται στις ιδιότητες του υλικού GLTF PBR όπου είναι δυνατόν. Ιδιοκτημένες επεκτάσεις υλικό 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);

Το site.save() λειτουργεί ασύγχροντα;? Όχι . scene.save() Το βάζετε σε ένα εργάτη, αν χρειαστεί να αποφύγετε το μπλοκ των γεγονότων κατά τη διάρκεια μεγάλων εξαγωγών.

Ποια εκδόσεις Node.js υποστηρίζονται;? Node.js 18, 20 και 22+ δεν υποστηρίζονται.

Δείτε επίσης

 Ελληνικά