Πώς να δημιουργήσετε ένα 3D πλέγμα με Aspose.3D σε Python

Πώς να δημιουργήσετε ένα 3D πλέγμα με Aspose.3D σε Python

Aspose.3D FOSS for Python σας επιτρέπει να δημιουργήσετε γεωμετρία 3D εξ ολοκλήρου σε κώδικα: δεν απαιτείται εξωτερικό εργαλείο μοντελοποίησης. Δημιουργείτε ένα Mesh, το γεμίζετε με θέσεις κορυφών (control_points) και ορισμούς προσώπων (polygons), προσθέτετε προαιρετικά χαρακτηριστικά κορυφών όπως τα κανονικά, και στη συνέχεια αποθηκεύετε τη σκηνή σε οποιαδήποτε υποστηριζόμενη μορφή.

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

Βήμα 1: Εγκατάσταση του πακέτου

Εγκαταστήστε το Aspose.3D FOSS από το PyPI. Δεν απαιτούνται εγγενείς επεκτάσεις ή εργαλεία μεταγλώττισης.

pip install aspose-3d-foss

Επαληθεύστε την εγκατάσταση:

from aspose.threed import Scene
print("Aspose.3D FOSS ready")

Υποστηριζόμενες εκδόσεις Python: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.


Βήμα 2: Δημιουργία σκηνής και κόμβου

Κάθε πλέγμα πρέπει να ζει μέσα σε ένα γράφημα σκηνής. Δημιουργήστε ένα Scene και προσθέστε ένα ονομασμένο Node για να κρατήσετε το πλέγμα:

from aspose.threed import Scene

scene = Scene()
node = scene.root_node.create_child_node("triangle")

Το όνομα του κόμβου διατηρείται στο εξαγόμενο αρχείο και είναι χρήσιμο για εντοπισμό σφαλμάτων και μετέπειτα ανάκτηση μέσω node.get_child("triangle").


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

Δημιουργήστε ένα Mesh με προαιρετικό περιγραφικό όνομα:

from aspose.threed.entities import Mesh

mesh = Mesh("triangle")

Το πλέγμα είναι αρχικά κενό: χωρίς κορυφές, χωρίς πολύγωνα. Το γεμίζετε στα παρακάτω βήματα.


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

Τα σημεία ελέγχου είναι οι θέσεις των κορυφών. Κάθε κορυφή αποθηκεύεται ως Vector4(x, y, z, w) όπου w=1 υποδεικνύει ένα σημείο σε τρισδιάστατο χώρο:

from aspose.threed.utilities import Vector4

##Vertex 0: origin
# Note: control_points returns a copy of the internal vertex list.
# Appending to the returned copy discards the vertex silently.
# Use _control_points to mutate the backing list directly.
# This is a known library limitation — a public add_control_point() API is not yet available.
mesh._control_points.append(Vector4(0.0, 0.0, 0.0, 1.0))

##Vertex 1: 1 unit along X
mesh._control_points.append(Vector4(1.0, 0.0, 0.0, 1.0))

##Vertex 2: apex
mesh._control_points.append(Vector4(0.5, 1.0, 0.0, 1.0))

print(f"Vertices added: {len(mesh.control_points)}")

Important: mesh.control_points επιστρέφει ένα αντίγραφο της εσωτερικής λίστας κορυφών (ο getter εκτελεί list(self._control_points)). Η κλήση του mesh.control_points.append(v) προσθέτει στο αντίγραφο, όχι στο πλέγμα, έτσι η κορυφή απορρίπτεται σιωπηρά. Πάντα χρησιμοποιείτε το mesh._control_points.append(v) για να προσθέτετε κορυφές. Η πρόσβαση σε ιδιωτική κατάσταση μέσω _control_points είναι γνωστή παράκαμψη· η διεπαφή μπορεί να αλλάξει σε μελλοντική έκδοση της βιβλιοθήκης.


Βήμα 5: Δημιουργία Πολυγωνικών Επιφανειών

Ορίστε την τοπολογία του προσώπου χρησιμοποιώντας δείκτες κορυφών. Περάστε τους δείκτες κορυφών στο create_polygon(). Τρία δείκτες δημιουργούν ένα τρίγωνο· τέσσερα δημιουργούν ένα τετράπλευρο:

##Triangle: connect vertices 0 → 1 → 2
mesh.create_polygon(0, 1, 2)

print(f"Polygon count: {mesh.polygon_count}")

Για ένα quad mesh θα περάσετε τέσσερις δείκτες: mesh.create_polygon(0, 1, 2, 3).

Οι δείκτες πρέπει να είναι έγκυρες θέσεις στο control_points (με βάση το 0, εντός εύρους). Η σειρά περιδίνησης είναι αριστερόστροφη για τις εξωτερικά προσανατολισμένες κανονικές.


Βήμα 6: Προσθήκη Κανονικών Κορυφών

Οι κανονικές κορυφές αποθηκεύονται ως VertexElement προσαρτημένο στο πλέγμα. Χρησιμοποιήστε mesh.create_element() με VertexElementType.NORMAL, MappingMode.CONTROL_POINT και ReferenceMode.DIRECT:

from aspose.threed.entities import VertexElementType, MappingMode, ReferenceMode, VertexElementNormal
from aspose.threed.utilities import Vector4, FVector4

##Create the normal element (returns VertexElementNormal, a VertexElementFVector subclass)
normals: VertexElementNormal = mesh.create_element(
    VertexElementType.NORMAL,
    MappingMode.CONTROL_POINT,
    ReferenceMode.DIRECT
)

##One normal per vertex: all pointing out of the XY plane (0, 0, 1)
normals.set_data([
    FVector4(0, 0, 1, 0),   # vertex 0
    FVector4(0, 0, 1, 0),   # vertex 1
    FVector4(0, 0, 1, 0),   # vertex 2
])

print("Normal layer attached.")

MappingMode.CONTROL_POINT σημαίνει ένα κανονικό ανά κορυφή. ReferenceMode.DIRECT σημαίνει ότι τα δεδομένα των κανονικών διαβάζονται με την ίδια σειρά όπως τα σημεία ελέγχου (χωρίς επιπλέον buffer δεικτών).

Οι κανονικοί διανύσματα χρησιμοποιούν FVector4(x, y, z, w) με w=0 για να υποδείξουν μια κατεύθυνση αντί για θέση. FVector4 είναι διάνυσμα float μονής ακρίβειας· τα δεδομένα χαρακτηριστικών κορυφής στις υποκλάσεις VertexElementFVector χρησιμοποιούν αυτόν τον τύπο.


Βήμα 7: Συνδέστε το Mesh με το Node και Αποθηκεύστε

Προσθέστε το πλέγμα στον κόμβο, στη συνέχεια αποθηκεύστε τη σκηνή:

node.add_entity(mesh)

scene.save("triangle.gltf")
print("Saved triangle.gltf")

Το πλήρες λειτουργικό σενάριο (όλα τα βήματα συνδυασμένα):

from aspose.threed import Scene
from aspose.threed.entities import Mesh, VertexElementType, MappingMode, ReferenceMode, VertexElementNormal
from aspose.threed.utilities import Vector3, Vector4, FVector4

scene = Scene()
node = scene.root_node.create_child_node("triangle")

mesh = Mesh("triangle")

##Add 3 vertices (x, y, z, w)
# Use _control_points to mutate the backing list directly (control_points returns a copy)
mesh._control_points.append(Vector4(0.0, 0.0, 0.0, 1.0))
mesh._control_points.append(Vector4(1.0, 0.0, 0.0, 1.0))
mesh._control_points.append(Vector4(0.5, 1.0, 0.0, 1.0))

##Create a triangle polygon
mesh.create_polygon(0, 1, 2)

##Add normals (create_element returns VertexElementNormal, a VertexElementFVector subclass)
normals: VertexElementNormal = mesh.create_element(VertexElementType.NORMAL, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT)
normals.set_data([
    FVector4(0, 0, 1, 0),
    FVector4(0, 0, 1, 0),
    FVector4(0, 0, 1, 0),
])

node.add_entity(mesh)
scene.save("triangle.gltf")

Κοινά προβλήματα

ΠρόβλημαΕπίλυση
IndexError σε create_polygonΒεβαιωθείτε ότι όλοι οι δείκτες είναι εντός range(len(mesh.control_points)). Οι δείκτες είναι μηδενικής βάσης.
Εξαγωγή πλέγματος με μηδενικές κορυφέςmesh.control_points.append(...) απορρίπτει σιωπηλά τις κορυφές επειδή η ιδιότητα επιστρέφει ένα αντίγραφο. Χρησιμοποιήστε mesh._control_points.append(...) αντί αυτού.
Ο αριθμός των κανονικών δεν ταιριάζει με τον αριθμό των κορυφώνΌταν χρησιμοποιείτε MappingMode.CONTROL_POINT + ReferenceMode.DIRECT, το normals.data πρέπει να έχει ακριβώς len(control_points) καταχωρήσεις.
Το πλέγμα λείπει από το αποθηκευμένο αρχείοΕπιβεβαιώστε ότι το node.add_entity(mesh) κλήθηκε πριν το scene.save(). Ένα πλέγμα που δεν είναι προσαρτημένο σε κανέναν κόμβο δεν εξάγεται.
Λάθος σειρά περιδρόμησης (η όψη φαίνεται αόρατη)Η αντίστροφη φορά των κορυφών (counter‑clockwise) παράγει ένα εξωτερικά προσανατολισμένο κανονικό διάνυσμα. Αντιστρέψτε τη σειρά των δεικτών στο create_polygon για να το αλλάξετε.
polygon_count επιστρέφει 0polygon_count διαβάζει την ίδια λίστα με το polygons. Εάν δεν κλήθηκε το create_polygon, η λίστα είναι κενή.
Τα κανονικά φαίνονται λανθασμένα στον προβολέαΒεβαιωθείτε ότι όλα τα διανύσματα κανονικών είναι μονάδες μήκους. Υπολογίστε τα με n / abs(n) ή περάστε προ‑κανονικοποιημένες τιμές.

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

Ποια είναι η διαφορά μεταξύ Vector3 και Vector4 για τα σημεία ελέγχου;

control_points αποθηκεύει αντικείμενα Vector4. Το στοιχείο w είναι η ομογενής συντεταγμένη: χρησιμοποιήστε w=1 για θέσεις κορυφών και w=0 για διανύσματα κατεύθυνσης όπως οι κανονικές. Το Vector3 χρησιμοποιείται για μετασχηματισμούς (μετάθεση, κλίμακα) αλλά όχι για αποθήκευση γεωμετρίας.

Μπορώ να δημιουργήσω ένα πλέγμα με τετράγωνα αντί για τρίγωνα;

Ναι. Καλέστε mesh.create_polygon(0, 1, 2, 3) με τέσσερα δείκτες για να ορίσετε ένα τετράγωνο. Ορισμένοι προορισμοί αποθήκευσης (STL, 3MF) απαιτούν τρίγωνα και θα τριγωνοποιήσουν αυτόματα τα τετράγωνα. Τα glTF και COLLADA διατηρούν τα τετράγωνα.

Πώς μπορώ να προσθέσω συντεταγμένες UV;

Χρησιμοποιήστε το mesh.create_element_uv(TextureMapping.DIFFUSE, MappingMode.POLYGON_VERTEX) για να δημιουργήσετε ένα VertexElementUV για το diffuse channel, στη συνέχεια γεμίστε τη λίστα data της με Vector4 καταχωρήσεις. Οι συντεταγμένες UV χρησιμοποιούν το x και το y· τα z και w είναι συνήθως 0. Το πρώτο όρισμα πρέπει να είναι μια σταθερά TextureMapping (π.χ., TextureMapping.DIFFUSE) που προσδιορίζει σε ποιο slot υφής ανήκει το επίπεδο UV.

Το πλέγμα χρειάζεται κανονικές για σωστή εξαγωγή;

Όχι. Τα normals είναι προαιρετικά. Εάν παραλειφθούν, οι περισσότεροι viewers υπολογίζουν τα per‑face normals από τη σειρά polygon winding order. Η προσθήκη explicit per‑vertex normals παράγει πιο ομαλή σκίαση.

Μπορώ να προσθέσω πολλαπλά πλέγματα σε έναν κόμβο;

Ναι. Καλέστε node.add_entity(mesh) πολλές φορές. Κάθε κλήση προσθέτει μια νέα οντότητα στο node.entities. Ορισμένες μορφές μπορεί να συμπτύξουν πολλές οντότητες σε μία κατά την εξαγωγή.

Πώς μπορώ να τριγωνίσω ένα πλέγμα με μεικτούς τύπους πολυγώνων;

Καλέστε mesh.triangulate() για να μετατρέψετε όλα τα τετράπλευρα και N‑γωνικά σε τρίγωνα επί τόπου. Αυτό είναι χρήσιμο πριν από την αποθήκευση σε μορφές που υποστηρίζουν μόνο τρίγωνα.

 Ελληνικά