Πώς να φορτώσετε 3D μοντέλα σε TypeScript
Το @aspose/3d πακέτο παρέχει στις εφαρμογές TypeScript και Node.js ένα απλό API για το άνοιγμα αρχείων 3D σκηνών. Το Scene είναι το αντικείμενο ρίζας: καλέστε το scene.open() με διαδρομή αρχείου και προαιρετικές επιλογές φόρτωσης ειδικές για τη μορφή, στη συνέχεια περιηγηθείτε στο scene.rootNode για πρόσβαση στη γεωμετρία, τα υλικά και τους μετασχηματισμούς.
Οδηγός βήμα προς βήμα
Βήμα 1: Εγκατάσταση του @aspose/3d μέσω npm
Προσθέστε το πακέτο στο έργο σας. Δεν απαιτούνται εγγενή δυαδικά αρχεία ή εργαλεία κατασκευής ειδικά για πλατφόρμα· μόνο το Node.js 18 ή νεότερο.
npm install @aspose/3dΓια έργα TypeScript, οι ορισμοί τύπων περιλαμβάνονται στο πακέτο:
##tsconfig.json: minimum required settings
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true
}
}Βήμα 2: Εισαγωγή σκηνής και επιλογές ειδικές για μορφή
Κάθε μορφή εκθέτει τη δική της κλάση φορτωτή και το αντικείμενο επιλογών σε υποδιαδρομή. Εισάγετε μόνο ό,τι χρειάζεστε:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Για άλλες μορφές το μοτίβο είναι το ίδιο:
import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';Βήμα 3: Ανοίξτε ένα αρχείο 3D χρησιμοποιώντας το scene.open()
Δημιουργήστε ένα Scene instance, στη συνέχεια καλέστε το scene.open() με τη διαδρομή του αρχείου και ένα προαιρετικό αντικείμενο load‑options. Η κλήση είναι συγχρονική.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;
scene.open('model.obj', options);
console.log('Scene loaded successfully');Για τη φόρτωση από ένα Buffer που βρίσκεται ήδη στη μνήμη (χρήσιμο σε περιβάλλοντα χωρίς διακομιστή ή ροής):
import * as fs from 'fs';
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const buffer = fs.readFileSync('model.obj');
const scene = new Scene();
scene.openFromBuffer(buffer, new ObjLoadOptions());Βήμα 4: Επανάληψη στους κόμβους της σκηνής
Το γράφημα σκηνής είναι ένα δέντρο με ρίζα το scene.rootNode. Κάθε Node μπορεί να περιέχει κόμβους‑παιδιά και ένα προαιρετικό entity (πλέγμα, κάμερα, φως, κ.λπ.).
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
function visitNode(node: any, depth: number = 0): void {
const indent = ' '.repeat(depth);
console.log(`${indent}Node: ${node.name}`);
if (node.entity) {
console.log(`${indent} Entity type: ${node.entity.constructor.name}`);
}
for (const child of node.childNodes) {
visitNode(child, depth + 1);
}
}
visitNode(scene.rootNode);Βήμα 5: Πρόσβαση στα δεδομένα κορυφών του πλέγματος μέσω controlPoints
Όταν η οντότητα ενός κόμβου είναι Mesh, μπορείτε να διαβάσετε τα ακατέργαστα σημεία ελέγχου (κορυφές) από τον πίνακα controlPoints. Κάθε καταχώρηση είναι ένα Vector4 με τα συστατικά x, y, z και w.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
for (const node of scene.rootNode.childNodes) {
if (!node.entity) continue;
const entity = node.entity;
// Check if the entity is a Mesh by duck-typing controlPoints
if ('controlPoints' in entity) {
const mesh = entity as any;
console.log(`Mesh "${node.name}": ${mesh.controlPoints.length} vertices`);
// Print first three vertices
for (let i = 0; i < Math.min(3, mesh.controlPoints.length); i++) {
const v = mesh.controlPoints[i];
console.log(` v[${i}]: x=${v.x.toFixed(4)}, y=${v.y.toFixed(4)}, z=${v.z.toFixed(4)}`);
}
}
}Βήμα 6: Διαμόρφωση ObjLoadOptions για φόρτωση υλικού
ObjLoadOptions εκθέτει ιδιότητες για τον έλεγχο του τρόπου με τον οποίο επιλύονται τα συνοδευτικά αρχεία υλικού .mtl και οι υφές.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const options = new ObjLoadOptions();
options.enableMaterials = true; // parse .mtl file if present
const scene = new Scene();
scene.open('model.obj', options);
// Inspect materials attached to nodes
for (const node of scene.rootNode.childNodes) {
if (node.material) {
console.log(`Material on "${node.name}": ${node.material.constructor.name}`);
}
}Κοινά προβλήματα και διορθώσεις
Σφάλμα: Δεν είναι δυνατή η εύρεση του module ‘@aspose/3d/formats/obj’
Οι υπο-διαδρομές μορφής απαιτούν εξαγωγές πακέτου Node.js 12.7+. Βεβαιωθείτε ότι χρησιμοποιείτε Node.js 18 ή νεότερο. Εάν χρησιμοποιείτε TypeScript, ορίστε "moduleResolution": "node16" ή "bundler" στο tsconfig.json.
scene.rootNode.childNodes είναι κενό μετά το open()
Ορισμένα αρχεία OBJ χρησιμοποιούν μη‑τυπικά τέλη γραμμής ή λείπουν το τελικό newline. Επαληθεύστε ότι το αρχείο είναι έγκυρο OBJ ανοίγοντάς το σε έναν επεξεργαστή κειμένου. Επίσης, βεβαιωθείτε ότι περάσατε ObjLoadOptions και όχι ένα γενικό LoadOptions: οι επιλογές ειδικές για τη μορφή απαιτούνται για τη σωστή διανομή.
controlPoints array has zero length
Το πλέγμα μπορεί να έχει φορτωθεί αλλά δεν περιέχει γεωμετρία (π.χ., μια κενή ομάδα στο OBJ). Χρησιμοποιήστε mesh.polygonCount για να ελέγξετε πριν διασχίσετε τις κορυφές.
Η χρήση μνήμης είναι υψηλή για μεγάλα αρχεία
Η φόρτωση από buffer με scene.openFromBuffer() δεν μειώνει τη μέγιστη μνήμη: πρέπει να αναλυθεί ολόκληρο το αρχείο. Για μεγάλα αρχεία (> 100 MB), βεβαιωθείτε ότι η διαδικασία Node.js σας διαθέτει επαρκή heap: node --max-old-space-size=4096 yourScript.js.
Σφάλματα τύπου: ’entity’ είναι τύπου ‘unknown’
Η ιδιότητα entity είναι ευρέως τυποποιημένη. Κάντε μετατροπή σε any ή σε συγκεκριμένη κλάση (Mesh, Camera, κ.λπ.) ανάλογα με το τι αναμένετε στη σκηνή σας.
Συχνές ερωτήσεις (FAQ)
Ποιοι μορφότυποι μπορούν να φορτωθούν με scene.open();
OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX και COLLADA (.dae) υποστηρίζονται όλα για εισαγωγή. Περνάτε την αντίστοιχη *LoadOptions κλάση για κάθε μορφότυπο.
Μπορώ να φορτώσω ένα αρχείο χωρίς να καθορίσω επιλογές;
Ναι. scene.open('model.glb') λειτουργεί χωρίς επιλογές για μορφές που δεν απαιτούν ειδική διαμόρφωση. Η παροχή επιλογών συνιστάται για OBJ επειδή η ανάλυση του υλικού εξαρτάται από enableMaterials.
Τρέχει η φόρτωση ασύγχρονα;
Όχι. scene.open() και scene.openFromBuffer() είναι συγχρονισμένα. Τυλίξτε τα σε νήμα εργασίας ή setImmediate εάν χρειάζεται να διατηρήσετε έναν βρόχο γεγονότων ανταποκρινόμενο.
Υποστηρίζεται η εξαγωγή OBJ;
Ναι. Η εξαγωγή OBJ υποστηρίζεται μέσω scene.save('output.obj'). Το αρχείο υλικού .mtl γράφεται αυτόματα μαζί με το αρχείο .obj.
Πού αναμένεται το αρχείο .mtl κατά τη φόρτωση του OBJ;
Από προεπιλογή, ο parser αναζητά το αρχείο .mtl που αναφέρεται μέσα στο OBJ (οδηγία mtllib) σχετικά με τον φάκελο του αρχείου OBJ. Βεβαιωθείτε ότι και τα δύο αρχεία βρίσκονται στον ίδιο φάκελο.