Φόρτωση 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 συνήθως δεν τα έχουν.

Αναφορά Επιλογών Φόρτωσης Κατά Μορφή

ΜορφήΚλάση ΕπιλογώνΔιαδρομή ΕισαγωγήςΚύριες Επιλογές
OBJObjLoadOptions@aspose/3d/formats/objenableMaterials, flipCoordinateSystem, scale, normalizeNormal
glTF / GLB(δεν απαιτείται)N/AΑυτόματη ανίχνευση· δεν χρειάζεται κλάση επιλογών
STLStlLoadOptions@aspose/3d/formats/stl(δεν υπάρχουν ρυθμιζόμενες επιλογές στην τρέχουσα έκδοση)
FBXFbxLoadOptions@aspose/3d/formats/fbx(δεν υπάρχουν ρυθμιζόμενες επιλογές στην τρέχουσα έκδοση)
COLLADAColladaLoadOptions@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 χρησιμοποιεί ενσωματωμένες μετασχηματίσεις, όχι κλιπΗ κίνηση ψήνεται ανά καρέ; ο πίνακας κλιπ θα είναι κενός

Δείτε επίσης

 Ελληνικά