Φόρτωση 3Δ Μοντέλων
@aspose/3d παρέχει δύο μεθόδους φόρτωσης στην Scene κλάση: open() για φόρτωση με διαδρομή αρχείου και openFromBuffer() για δεδομένα στη μνήμη. Η ανίχνευση μορφής είναι αυτόματη από τους δυαδικούς μαγικούς αριθμούς ή την επέκταση του αρχείου, έτσι σπάνια χρειάζεται να καθορίσετε ρητά τη μορφή προέλευσης.
Φόρτωση από διαδρομή αρχείου
Περάστε τη συμβολοσειρά διαδρομής αρχείου στο scene.open(). Η βιβλιοθήκη ανιχνεύει τη μορφή από την επέκταση του αρχείου και, για δυαδικές μορφές, από τα μαγικά bytes:
import { Scene } from '@aspose/3d';
const scene = new Scene();
scene.open('model.fbx');
console.log(`Root children: ${scene.rootNode.childNodes.length}`);
console.log(`Animation clips: ${scene.animationClips.length}`);open() αντικαθιστά οποιοδήποτε υπάρχον περιεχόμενο σκηνής. Εάν χρειάζεται να φορτώσετε πολλαπλά αρχεία, δημιουργήστε ξεχωριστά Scene αντιπροσωπείες.
Φόρτωση OBJ με Υλικά
Τα αρχεία OBJ αναφέρονται σε υλικά μέσω ενός sidecar .mtl αρχείου. Η φόρτωση υλικών είναι ενεργοποιημένη από προεπιλογή (ObjLoadOptions.enableMaterials = true). Περάστε ObjLoadOptions για να ελέγξετε αυτό και άλλες επιλογές κατά τη φόρτωση:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true; // load the .mtl sidecar
options.flipCoordinateSystem = false; // keep original Y-up orientation
options.normalizeNormal = true; // fix degenerate normals
options.scale = 1.0; // unit scale multiplier
scene.open('character.obj', options);
// Inspect materials on the first node
const first = scene.rootNode.childNodes[0];
if (first) {
console.log(`Materials on ${first.name}: ${first.materials.length}`);
}Φόρτωση από Buffer
Χρησιμοποιήστε openFromBuffer() όταν τα δεδομένα του αρχείου είναι ήδη στη μνήμη, για παράδειγμα από ένα HTTP fetch, ένα BLOB βάσης δεδομένων ή εξαγωγή από zip αρχείο. Αυτό αποφεύγει την εγγραφή στο δίσκο:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import * as fs from 'fs';
const buffer: Buffer = fs.readFileSync('model.obj');
const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;
scene.openFromBuffer(buffer, options);
console.log(`Loaded ${scene.rootNode.childNodes.length} root nodes`);Για δυαδικές μορφές (GLB, STL binary, 3MF), η βιβλιοθήκη διαβάζει τα μαγικά bytes από το buffer για να ανιχνεύσει τη μορφή αυτόματα, έτσι μπορείτε να περάσετε undefined ως το όρισμα options:
import { Scene } from '@aspose/3d';
import * as fs from 'fs';
const glbBuffer: Buffer = fs.readFileSync('model.glb');
const scene = new Scene();
scene.openFromBuffer(glbBuffer); // format auto-detected from GLB magic bytes
Φόρτωση από HTTP (Node.js 18+)
Ανακτήστε ένα απομακρυσμένο πόρο και φορτώστε το χωρίς να αγγίξετε το σύστημα αρχείων:
import { Scene } from '@aspose/3d';
async function loadFromUrl(url: string): Promise<Scene> {
const response = await fetch(url);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
const scene = new Scene();
scene.openFromBuffer(buffer);
return scene;
}
const scene = await loadFromUrl('https://example.com/model.glb');
console.log(`Loaded scene: ${scene.rootNode.childNodes.length} root nodes`);Επιθεώρηση της Φορτωμένης Σκηνής
Μετά τη φόρτωση, περιηγηθείτε στο γράφημα σκηνής για να απαριθμήσετε κόμβους και να εντοπίσετε γεωμετρία:
import { Scene, Mesh, Node } from '@aspose/3d';
const scene = new Scene();
scene.open('model.fbx');
function inspect(node: Node, depth: number = 0): void {
const indent = ' '.repeat(depth);
const entityType = node.entity ? node.entity.constructor.name : '(none)';
console.log(`${indent}${node.name} [${entityType}]`);
if (node.entity instanceof Mesh) {
const mesh = node.entity as Mesh;
console.log(`${indent} vertices: ${mesh.controlPoints.length}, polygons: ${mesh.polygonCount}`);
}
for (const child of node.childNodes) {
inspect(child, depth + 1);
}
}
inspect(scene.rootNode);Ανάγνωση Μεταδεδομένων Πόρου
Το assetInfo η ιδιότητα εκθέτει μεταδεδομένα σε επίπεδο αρχείου:
import { Scene } from '@aspose/3d';
const scene = new Scene();
scene.open('model.fbx');
const info = scene.assetInfo;
if (info) {
console.log(`Creator: ${info.creator}`);
console.log(`Unit name: ${info.unitName}`);
console.log(`Unit scale: ${info.unitScaleFactor}`);
}Δεν όλα τα formats συμπληρώνουν assetInfo. Το FBX και το COLLADA έχουν πλούσια μεταδεδομένα· το OBJ και το STL συνήθως δεν τα έχουν.
Αναφορά Επιλογών Φόρτωσης Κατά Μορφή
| Μορφή | Κλάση Επιλογών | Διαδρομή Εισαγωγής | Κύριες Επιλογές |
|---|---|---|---|
| OBJ | ObjLoadOptions | @aspose/3d/formats/obj | enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
| glTF / GLB | (δεν απαιτείται) | N/A | Αυτόματη ανίχνευση· δεν χρειάζεται κλάση επιλογών |
| STL | StlLoadOptions | @aspose/3d/formats/stl | (δεν υπάρχουν ρυθμιζόμενες επιλογές στην τρέχουσα έκδοση) |
| FBX | FbxLoadOptions | @aspose/3d/formats/fbx | (δεν υπάρχουν ρυθμιζόμενες επιλογές στην τρέχουσα έκδοση) |
| COLLADA | ColladaLoadOptions | @aspose/3d/formats/collada | (δεν υπάρχουν ρυθμιζόμενες επιλογές στην τρέχουσα έκδοση) |
| 3MF | (δεν απαιτείται) | N/A | Αυτόματη ανίχνευση |
Κοινά Σφάλματα Φόρτωσης
| Σύμπτωμα | Αιτία | Διόρθωση |
|---|---|---|
Error: Cannot find module '@aspose/3d/formats/obj' | moduleResolution δεν ορίζεται σε node | Προσθήκη "moduleResolution": "node" σε tsconfig.json |
| Κενή λίστα κόμβων μετά τη φόρτωση του OBJ | .mtl το sidecar λείπει ή enableMaterials δεν έχει οριστεί | Ορίστε options.enableMaterials = true και βεβαιωθείτε .mtl είναι στον ίδιο φάκελο |
Η σκηνή φορτώνεται αλλά rootNode.childNodes είναι κενή | Η μορφή χρησιμοποιεί ένα μόνο ριζικό πλέγμα, όχι θυγατρικούς κόμβους | Πρόσβαση scene.rootNode.entity απευθείας |
openFromBuffer ρίχνει σφάλμα με δυαδικό STL | Το buffer κόπηκε λανθασμένα (λείπουν τα τελικά byte) | Χρησιμοποιήστε το πλήρες readFileSync() αποτέλεσμα χωρίς κοπή |
| Ο πίνακας των κλιπ κίνησης είναι κενός μετά τη φόρτωση του FBX | Το αρχείο FBX χρησιμοποιεί ενσωματωμένες μετασχηματίσεις, όχι κλιπ | Η κίνηση ψήνεται ανά καρέ; ο πίνακας κλιπ θα είναι κενός |
Δείτε επίσης
- Αποθήκευση 3D μοντέλων: επιλογές εξαγωγής και
saveToBuffer - Γράφημα σκηνής: διαπέραση και τροποποίηση της ιεραρχίας κόμβων
- API Overview: όλες οι κλάσεις και οι απαριθμήσεις
- Format Support: πλήρης πίνακας ανάγνωσης/εγγραφής