Πώς να φορτώσετε 3D μοντέλα σε TypeScript

Πώς να φορτώσετε 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: Εισάγετε το Scene και τις επιλογές ειδικές για τη μορφή

Κάθε μορφή εκθέτει τη δική της κλάση φορτωτή και το αντικείμενο επιλογών σε υποδιαδρομή. Εισάγετε μόνο ό,τι χρειάζεστε:

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 ήδη στη μνήμη (χρήσιμο σε περιβάλλοντα serverless ή streaming):

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 (mesh, camera, light, κ.λπ.).

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,μπορείτε να διαβάσετε τα ακατέργαστα σημεία ελέγχου (vertices) από το controlPoints array. Κάθε καταχώρηση είναι ένα 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}`);
    }
}

Κοινά προβλήματα και διορθώσεις

Σφάλμα: Cannot find 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 έχει μηδενικό μήκος Το πλέγμα ενδέχεται να έχει φορτωθεί αλλά δεν περιέχει γεωμετρία (π.χ., μια κενή ομάδα στο OBJ). Χρησιμοποιήστε mesh.polygonCount για να ελέγξετε πριν την επανάληψη των vertices.

Η χρήση μνήμης είναι υψηλή για μεγάλα αρχεία Φόρτωση-από-πρόσθετο με 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. Βεβαιωθείτε ότι και τα δύο αρχεία βρίσκονται στον ίδιο φάκελο.

Δείτε επίσης

 Ελληνικά