Πώς να χτίσετε ένα 3D Mesh με Aspose.3D στο Python
Το Aspose.3D FOSS για Python σας επιτρέπει να δημιουργήσετε 3D γεωμετρία εντελώς σε κώδικα: δεν απαιτείται εξωτερικό εργαλείο μοντέλου. Mesh,Η θέση του είναι με τις παρακμήσεις (control_pointsκαι με τις διατάξεις του (polygons), προσθέστε προαιρετικά χαρακτηριστικά vertex όπως τα κανονικά, στη συνέχεια αποθηκεύστε τη σκηνή σε οποιαδήποτε υποστηριζόμενη μορφή.
Βήμα προς βήμα οδηγός
Βήμα 1: Εγκατάσταση του πακέτου
Εγκαταστήστε το Aspose.3D FOSS από την PyPI. Δεν απαιτούνται εγχώριες επεκτάσεις ή εργαλειοθήκη του compiler.
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
Ελέγξτε την εγκατάσταση:
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 Εμφανίζει ένα σημείο στο 3D χώρο:
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)}")Σημαντικό : ΟΙ ΠΡΟΣΟΧΕΣmesh.control_points Επιστρέφει ο Α Κοπιάσεις από την εσωτερική λίστα vertex (ο getter εκτελεί list(self._control_points)• Καλέστε mesh.control_points.append(v) προσθέτει στο αντίγραφο, όχι στη μάζα, έτσι ώστε το στήθος να αποσυνδέεται σιωπηλά. mesh._control_points.append(v) προσθήκη κελιών. πρόσβαση ιδιωτικού κράτους μέσω _control_points είναι γνωστό εργάτης· η διεπαφή μπορεί να αλλάξει σε μια μελλοντική έκδοση της βιβλιοθήκης.
Βήμα 5: Δημιουργία πολυγώνων προσώπων
Ορισμός της τοπολογίας του προσώπου χρησιμοποιώντας δεικτές. Pass vertex ενδείξεις σε create_polygon().Τρεις δείκτες παράγουν ένα τρίγωνο, τέσσερις παράγονται ένα τετράγωνος:
##Triangle: connect vertices 0 → 1 → 2
mesh.create_polygon(0, 1, 2)
print(f"Polygon count: {mesh.polygon_count}")Για ένα τετράγωνο μασχ θα περάσετε τέσσερις ενδείξεις: mesh.create_polygon(0, 1, 2, 3).
Οι δείκτες πρέπει να είναι έγκυρες θέσεις σε control_points Η σειρά αερίου είναι αντί-ώρα για εξωτερικά κανονικά.
Βήμα 6: Προσθήκη Vertex κανονικά
Οι κανονικές συνθήκες του Vertex αποθηκεύονται ως ένα 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 σημαίνει ότι τα κανονικά δεδομένα διαβάζονται με την ίδια σειρά με τα σημεία ελέγχου (χωρίς επιπλέον δείκτη).
Κανονική χρήση vectors FVector4(x, y, z, w) Με w=0 Να δείξει μια κατεύθυνση αντί για μία θέση. FVector4 είναι ένα μονο-ακριβής πλωτό vector· vertex χαρακτηριστικά δεδομένων σε VertexElementFVector Οι υποκλάσεις χρησιμοποιούν αυτό το είδος.
Βήμα 7: Σύνδεσε το μαστίλι στο κόμβο και σώσει
Προσθέστε το μαστό στο κουδούνι, στη συνέχεια αποθηκεύστε τη σκηνή:
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)).Οι δείκτες είναι 0-based. |
| Εξαγωγές με μηδενικές καμπύλες | mesh.control_points.append(...) σιωπηλά αποσπάται οι κατώτερες, επειδή η ιδιοκτησία επιστρέφει ένα αντίγραφο. mesh._control_points.append(...) Αντί να. |
| Ο κανονικός αριθμός δεν ταιριάζει με τον αριθμό του vertex. | Όταν χρησιμοποιείτε MappingMode.CONTROL_POINT + ReferenceMode.DIRECT, normals.data Πρέπει να έχει ακριβώς len(control_points) εισόδου . |
| Απεβίωσε το αρχείο από τα αποθηκευμένα | επιβεβαιώνουμε ότι node.add_entity(mesh) Προηγουμένως καλούσε scene.save().Μια μάζα που δεν είναι συνδεδεμένη με κανένα κόμβο δεν εξάγεται. |
| Λάθος κανονισμός (φάντα φαίνεται αόρατο) | Η σειρά αντιστάθμισης παράγει μια εξωτερική κανονικότητα.Περίστρεψε την τάξη του δείκτη στο create_polygon να το φλέβει. |
polygon_count Επιστροφή 0 | polygon_count Διαβάστε την ίδια λίστα με το polygons.Αν create_polygon Δεν έχει καλέσει, η λίστα είναι κενή. |
| Οι κανονισμοί φαίνονται εσφαλμένοι στον θεατή | Να διασφαλιστεί ότι όλα τα κανονικά vectors είναι μονάδες μήκους. n / abs(n) ή να περάσουν προ-βιομηχανισμένες τιμές. |
Συχνές ερωτήσεις
Ποια είναι η διαφορά μεταξύ Vector3 και Vector4 Για τα σημεία ελέγχου;?
control_points ΣΤΑΡΕΣ Vector4 Σχετικά με το αντικείμενο.The w Το συστατικό είναι ο ομοιογενής συντονισμός: χρήση w=1 για τις θέσεις του Vertex και 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 για το διάχυτο κανάλι, στη συνέχεια πληθυσμός του data Η λίστα με Vector4 Εισαγωγή: Η χρήση των συντονισμών UV x και y; z και w Το πρώτο ερώτημα είναι ότι το 0 πρέπει να είναι ένα TextureMapping Συνεχής (π.χ., TextureMapping.DIFFUSE2) να προσδιορίσει ποια κλωστή της υφασματικής ρύθμισης ανήκει στο UV στρώμα.
Χρειάζεται η μάζα κανονικά για να εξάγει σωστά;?
Όχι. οι κανονικοί είναι προαιρετικοί. αν παραλείπονται, οι περισσότεροι θεατές υπολογίζουν τους κανόνα ανά πρόσωπο από την σειρά του πολυγώνου. η προσθήκη σαφούς κατ ‘επισκόπηση κανοτήτων παράγει πιο ομαλή σκιά.
Μπορώ να προσθέσω πολλαπλές μασές σε ένα κόμβο;?
Ναι, καλέστε node.add_entity(mesh) Κάθε κλήση προσθέτει μια νέα οντότητα σε ένα node.entities.Ορισμένες μορφές μπορεί να στρέψουν πολλαπλές οντότητες σε μία εξαγωγή.
Πώς μπορώ να τριγύρω ένα μασχ με μικτούς τύπους πολυγόνων;?
Κλήση mesh.triangulate() να μετατρέψετε όλα τα Quads και N-gons σε τριαδικούς τόπους. Αυτό είναι χρήσιμο πριν από την αποθήκευση σε μορφές που υποστηρίζουν μόνο τα τριάδα.