Πώς να δημιουργήσετε ένα 3D Mesh Προγραμματικά σε TypeScript

Πώς να δημιουργήσετε ένα 3D Mesh Προγραμματικά σε TypeScript

Aspose.3D FOSS για TypeScript σας επιτρέπει να δημιουργήσετε 3D γεωμετρία εντελώς σε κώδικα χωρίς να φορτίζετε οποιοδήποτε αρχείο. Ορίζετε τις θέσεις του σπονδυλικού ως σημεία ελέγχου, καθορίστε τα πρόσωπα της πολυγώνης με δείκτη και προσθέστε προαιρετικά στοιχεία του αριστερού όπως κανονικά, UVs ή χρώματα του πλανήτη. Το αποτέλεσμα μπορεί να αποθηκευτεί σε οποιαδήποτε γραπτή μορφή: glTF, GLB, STL, FBX ή COLLADA.

Προϋποθέσεις

  • Node.js 18 ή αργότερα
  • TypeScript 5.0 ή νεότερη
  • @aspose/3d Εισαγωγή (βλέπε Βήμα 1)

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

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

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

Δεν απαιτούνται εγχώριες πρόσθετες ή βιβλιοθήκες συστήματος.Το πακέτο περιλαμβάνει ορισμούς τύπου TypeScript.

Μινιμίνιο tsconfig.json:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "moduleResolution": "node",
    "esModuleInterop": true,
    "strict": true
  }
}

Βήμα 2: Δημιουργήστε μια σκηνή και ένα κόμβο

Α Scene Το υλικό είναι το υψηλότερο επίπεδο.Όλα τα γεωμετρία πρέπει να συνδέονται με ένα Node Μέσα στο δέντρο:

import { Scene } from '@aspose/3d';

const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');

createChildNode(name) δημιουργεί ένα ονομαστικό κόμβο και το συνδέει ως παιδί του τρέχοντος κόμπου. Node Το αντικείμενο είναι όπου θα προσθέσετε το μασά στο βήμα 7.


Βήμα 3: Δημιουργία αντικειμένου Mesh

Mesh Διατηρεί τις θέσεις του παρασκήνιο και τους ορισμούς της πολυγώνης. Κατασκευάστε ένα με επιλεκτικό όνομα:

import { Mesh } from '@aspose/3d/entities';

const mesh = new Mesh('triangle');

Η μασχάλια αρχίζει άδειο: χωρίς κατεύθυνση και χωρίς πρόσωπα.


Βήμα 4: Προσθήκη σημείων ελέγχου (αποκλειστικές)

Τα σημεία ελέγχου είναι οι τοποθεσίες του παρασκήνιο στο τοπικό χώρο. Vector4 Αξίες μέσα mesh.controlPoints.Το τέταρτο τμήμα (w) είναι 1 Για θέσεις:

import { Vector4 } from '@aspose/3d/utilities';

mesh.controlPoints.push(new Vector4(0.0, 0.0, 0.0, 1.0)); // index 0
mesh.controlPoints.push(new Vector4(1.0, 0.0, 0.0, 1.0)); // index 1
mesh.controlPoints.push(new Vector4(0.5, 1.0, 0.0, 1.0)); // index 2

Αναφέρετε αυτές τις θέσεις με τον δείκτη τους που βασίζεται στο μηδέν κατά τον καθορισμό των προσώπων πολυγώνου.


Βήμα 5: Δημιουργία πολυγώνων προσώπων

createPolygon() Ορισμός ενός προσώπου με την κατάταξη των δεικτών σε σειρά.Τρία δείκτες κάνουν ένα τρίγωνο:

mesh.createPolygon(0, 1, 2);

Μπορείτε επίσης να ορίσετε quads (τέσσερις δείκτες) ή αυθαίρετα πολυγόνες για μορφές που τις υποστηρίζουν. για glTF, η βιβλιοθήκη θα τριγωνίσει αυτόματα quades και n-gons στην εξαγωγή.


Βήμα 6: Προσθήκη Vertex κανονικά

Η ποιότητα των προϊόντων βελτιώνεται. χρησιμοποιήστε mesh.createElement() Για να δημιουργήσουμε ένα VertexElementNormal, συλλέγουν τα κανονικά vectors σε μια σειρά, στη συνέχεια καλούν setData() να τα αποθηκεύσουμε.Τα data το πηλό επιστρέφει ένα αντίγραφο αμυντικό - η πιέση σε αυτό δεν έχει αποτέλεσμα. FVector3 (απόμονη ακρίβεια) για τα κανονικά δεδομένα, όχι Vector4.

import { VertexElementNormal } from '@aspose/3d/entities';
import { VertexElementType, MappingMode, ReferenceMode } from '@aspose/3d/entities';
import { FVector3 } from '@aspose/3d/utilities';

const normals = mesh.createElement(
    VertexElementType.NORMAL,
    MappingMode.CONTROL_POINT,
    ReferenceMode.DIRECT
) as VertexElementNormal;

// Build the normal array, then call setData() — do NOT push to normals.data
normals.setData([
    new FVector3(0, 0, 1), // normal for vertex 0 (pointing +Z)
    new FVector3(0, 0, 1), // normal for vertex 1
    new FVector3(0, 0, 1), // normal for vertex 2
]);

MappingMode.CONTROL_POINT Το κανονικό είναι ένα ανά στίχο. ReferenceMode.DIRECT Το σύνολο των δεδομένων είναι εντελώς indexed από τον δείκτη vertex polygon.


Βήμα 7: Προσθέστε το Mesh και Σώστε στο glTF

Προσδιορίστε το μασχ στο κόμβο μέσω node.entity,Στη συνέχεια, αποθηκεύστε την σκηνή:

import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';

node.entity = mesh;

const saveOpts = new GltfSaveOptions();
scene.save('triangle.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Triangle mesh saved to triangle.gltf');

Για να δημιουργήσετε ένα μόνο αυτο-συμπεριλαμβανόμενο .glb Αντί να το κάνετε, ο saveOpts.binaryMode = true αλλάζει την επέκταση του αρχείου εκκίνησης σε .glb.

Πλήρης παράδειγμα

Το επόμενο είναι το πλήρες σενάριο που συνδυάζει όλα τα βήματα παραπάνω:

import { Scene } from '@aspose/3d';
import { Mesh, VertexElementNormal } from '@aspose/3d/entities';
import { VertexElementType, MappingMode, ReferenceMode } from '@aspose/3d/entities';
import { Vector4, FVector3 } from '@aspose/3d/utilities';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';

const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');

const mesh = new Mesh('triangle');

mesh.controlPoints.push(new Vector4(0.0, 0.0, 0.0, 1.0));
mesh.controlPoints.push(new Vector4(1.0, 0.0, 0.0, 1.0));
mesh.controlPoints.push(new Vector4(0.5, 1.0, 0.0, 1.0));

mesh.createPolygon(0, 1, 2);

const normals = mesh.createElement(
    VertexElementType.NORMAL,
    MappingMode.CONTROL_POINT,
    ReferenceMode.DIRECT
) as VertexElementNormal;

// setData() is the correct API — normals.data returns a defensive copy; pushing to it has no effect
normals.setData([
    new FVector3(0, 0, 1),
    new FVector3(0, 0, 1),
    new FVector3(0, 0, 1),
]);

node.entity = mesh;

const saveOpts = new GltfSaveOptions();
scene.save('triangle.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Triangle mesh saved to triangle.gltf');

τρέχει με ts-node:

npx ts-node triangle.ts

κοινά ζητήματα

ΘέμαΑιτίαΦΙΛΕΞΗ
mesh.controlPoints.length 0 μετά το pushΜήκος που δεν αναφέρεται από κανένα κόμβοΠιέστε πριν από την απονομή node.entity;Η παραγγελία δεν έχει σημασία, αλλά επαληθεύει την αναφορά
Η εξαγωγή παράγει κενή γεωμετρίαnode.entity Δεν ανατίθεταιΑσφάλεια node.entity = mesh Πριν καλέσει scene.save()
Κανονικό αριθμό αμφισβητείταιΟ Αρέι πέρασε στο setData() Λιγότερο από controlPointsΠροσθέστε ένα FVector3 Εισαγωγή ανά σημείο ελέγχου όταν χρησιμοποιείτε MappingMode.CONTROL_POINT
GTTF: Οραματισμός του μαύρου μαστούΟ κανονικός δείκτης προς τα μέσαΗ αντίστροφη τάξη του createPolygon (π.χ . για να., 0, 2, 1• Να αρνηθεί τους κανονικούς βέκτες
TypeScript: η ιδιοκτησία ’normals.data’ δεν βρέθηκεΛάθος δρόμο εισαγωγήςεισαγωγών VertexElementNormal Από την @aspose/3d/entities,Όχι από @aspose/3d ρίζα

Συχνές ερωτήσεις

Μπορώ να δημιουργήσω τριαντάφυλλα αντί για τετράγωνο;? Να περάσουν τέσσερις ενδείξεις για να createPolygon(0, 1, 2, 3).Η βιβλιοθήκη τριγώνων τετράγωνο κατά την εξαγωγή σε μορφές που απαιτούν τριχοειδή (glTF, STL).

Ποια είναι η διαφορά μεταξύ MappingMode.CONTROL_POINT και MappingMode.POLYGON_VERTEX? CONTROL_POINT Σας δίνουμε μία τιμή ανά ενιαίο vertex. POLYGON_VERTEX αποθηκεύει μία τιμή ανά ζεύγος πολυγωνίου-στρωτή, η οποία επιτρέπει διαφορετικές κανονικές στο ίδιο στρώμα όταν ανήκει σε πολλαπλές πολυγονούς (κληρές άκρες).

Πρέπει να τριγύρω το μαστίλι πριν αποθηκεύσω στο STL;? Η βιβλιοθήκη χειρίζεται αυτόματα την τριγωνιστικότητα όταν εξάγει σε μορφές που απαιτούν τριγώνια. Μπορείτε να ορίσετε quads και n-gons στο μασχ και να αποθηκεύσετε στο STL απευθείας.

Πώς μπορώ να προσθέσω συντονιστές UV;? Χρησιμοποιήστε mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT) Για να δημιουργήσουμε ένα VertexElementUV,Στη συνέχεια καλέστε setData([...]) Με μια σειρά από FVector2 ή FVector3 Αξίες - ένα ανά σημείο ελέγχου. data Το πηκτωμα επιστρέφει ένα αντίγραφο. μην το πιέζετε απευθείας.

Μπορώ να δημιουργήσω πολλαπλές σκηνές σε μια σκάνδαλη;? Ναι. Δημιουργήστε πολλαπλούς κόμβους κάτω από scene.rootNode και να προσδιορίσει ξεχωριστά Mesh Σε κάθε κόμβο του entity ιδιοκτησία .

Δείτε επίσης

 Ελληνικά