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

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

Η @aspose/3d Το πακέτο παρέχει στις εφαρμογές TypeScript και Node.js ένα απλό API για το άνοιγμα αρχείων σκηνής 3D. Scene Το αντικείμενο είναι το ρίζο: κλήση scene.open() με ένα δρομολόγιο αρχείων και επιλεκτικές επιλογές φόρτισης ειδικού μορφής, στη συνέχεια διασχίζετε scene.rootNode να έχουν πρόσβαση στη γεωμετρία, τα υλικά και τις μετασχηματισμοί.

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

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

Δεν απαιτούνται εγχώριες δυαδικές ή πλατφόρμες-ειδιοτελείς εργαλείων κατασκευής. μόνο Node.js 18 ή αργότερα.

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

Για τα έργα 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()

Δημιουργία A Scene ΕΡΩΤΗΣΗ, Τότε καλέστε scene.open() με το δρομολόγιο αρχείου και ένα προαιρετικό αντικείμενο επιλογών φόρτισης. η κλήση είναι συγχρονισμένη.

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');

Για να φορτίσει από το A Buffer ήδη στη μνήμη (χρησιμοποιείται σε μη διακομιστές ή 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 (Μεγάλες, κάμερες και φωτισμοί κλπ.).

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: Πρόσβαση στα δεδομένα του Mesh Vertex μέσω των στοιχείων ελέγχου

Όταν η ουσία ενός κόμβου είναι μια 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+. βεβαιωθείτε ότι είστε στο Noda.js 18 ή αργότερα. "moduleResolution": "node16" ή "bundler" Σε tsconfig.json.

Το site.rootNode.childNodes είναι κενό μετά το άνοιγμα() Ορισμένα αρχεία OBJ χρησιμοποιούν μη τυποποιημένες γραμμές ή δεν έχουν ένα νέο γραμμή. επαληθεύστε το αρχείο είναι έγκυρο OBD με ανοίξτε το σε έναν επεξεργαστή κειμένου. Επιβεβαιώστε επίσης ότι έχετε περάσει ObjLoadOptions Όχι γενικότερα. LoadOptions: οι επιλογές που είναι ειδικές σε μορφή απαιτούνται για την ορθή αποστολή.

Η σειρά των σημείων ελέγχου έχει μηδενικό μήκος Η μπάλα μπορεί να έχει φορτωθεί αλλά δεν περιέχει γεωμετρία (π.χ., μια κενή ομάδα στο OBJ). mesh.polygonCount Να ελέγξετε πριν τα βυθίσματα.

Η χρήση μνήμης είναι υψηλή για μεγάλα αρχεία Το φορτίο από το buffer με scene.openFromBuffer() δεν μειώνει την κορυφή της μνήμης: ολόκληρο το αρχείο πρέπει να είναι παρσεσμένο. για μεγάλα αρχεία (> 100 MB), βεβαιωθείτε ότι η διαδικασία Node.js έχει επαρκή χέρι: node --max-old-space-size=4096 yourScript.js.

Τύπος σφάλματος: Η «εντότητα» είναι τύπου «αγνωστός» Η entity Η ιδιοκτησία είναι ευρέως τυπική.Cast to 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 Αν χρειαστεί να κρατήσετε ένα event loop αντίδρατο.

Η ΕΚΤ υποστηρίζεται;? ΟΙ ΕΞΩΤΕΡΕΣ ΥΠΟΧΕΙΡΙΣΜΟΣ ΣΤΗΡΙΖΟΥΝ ΜΕΤΑΦΟΡΑ scene.save('output.obj').mtl Το αρχείο γράφεται αυτόματα μαζί με το .obj αρχείο .

Πού είναι το αρχείο .mtl που αναμένεται όταν φορτώνετε OBJ;? Με την επιλογή, ο παίκτης αναζητά το .mtl Το αρχείο που αναφέρεται στο OBJ (mtllib Οδηγίες) σχετικά με το αρχείο του κειμένου. βεβαιωθείτε ότι και τα δύο αρχεία βρίσκονται στο ίδιο φάκελο.

Δείτε επίσης

 Ελληνικά