Πώς να φορτώσετε 3D μοντέλα στο Python
Το Aspose.3D FOSS για Python παρέχει ένα απλό API για το άνοιγμα 3D αρχείων χωρίς καμία εγχώρια εξάρτηση. Scene αντικείμενο, μπορείτε να περπατήσετε τη ιεραρχία των κόμβων και να διαβάσετε τα δεδομένα γεωμετρίας για κάθε μασχ στην σκηνή.
Βήμα προς βήμα οδηγός
Βήμα 1: Εγκατάσταση του πακέτου
Εγκαταστήστε το Aspose.3D FOSS από την PyPI. Δεν απαιτούνται πρόσθετες βιβλιοθήκες συστήματος.
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
Υποστηριζόμενες εκδόσεις Python: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.
Βήμα 2: Εισαγωγή της κλάσης σκηνής
Η Scene Η τάξη είναι το κορυφαίο δοχείο για όλα τα δεδομένα 3D. Εισάγετε μαζί με οποιαδήποτε κατηγορίες επιλογής φόρτισης που χρειάζεστε.
from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptionsΌλες οι δημόσιες τάξεις ζουν κάτω από το aspose.threed και τα υποσυσκευαστικά του (aspose.threed.entities, aspose.threed.formats, aspose.threed.utilities).
Βήμα 3: Κατεβάστε ένα αρχείο
Χρησιμοποιήστε το στατικό Scene.from_file() Η βιβλιοθήκη ανιχνεύει αυτόματα τη μορφή από την επέκταση αρχείου.
##Automatic format detection
scene = Scene.from_file("model.obj")Εναλλακτικά, δημιουργήστε ένα Scene ΕΡΓΑΣΙΑ ΚΑΙ ΚΛΗΜΟΣ open();Χρήσιμο όταν θέλετε να περάσετε τις επιλογές φόρτισης ή να χειριστείτε τα λάθη ρητά:
scene = Scene()
scene.open("model.obj")Και οι δύο μεθόδους υποστηρίζουν OBJ, STL (βινική και ASCII), glTF 2.0 / GLB, COLLADA (DAE) και 3MF αρχεία.
Βήμα 4: Περπατήστε το σκηνικό
Μια σκηνή φορτισμένη είναι ένα δέντρο Node αντικείμενα που ριζώνουν σε scene.root_node.Επαναλαμβάνετε επαναλαμβανόμενοι για να βρείτε όλους τους κόμβους:
from aspose.threed import Scene, Node
scene = Scene.from_file("model.obj")
def walk(node: Node, depth: int = 0) -> None:
indent = " " * depth
print(f"{indent}Node: {node.name!r}")
for child in node.child_nodes:
walk(child, depth + 1)
walk(scene.root_node)Κάθε ένα Node Μπορεί να φέρει μηδέν ή περισσότερα. Entity αντικείμενα (μεσάζ, κάμερες, φώτα). ελέγξτε node.entities Να δούμε τι είναι συνδεδεμένο.
Βήμα 5: Πρόσβαση στα Vertex και τα Πολυγόνα Δεδομένα
Κάντε μια ενότητα ενός κόμβου για να Mesh και διαβάστε τα σημεία ελέγχου (περιφερειακές θέσεις) και τις πολυγόνες (εικόνες προσώπου):
from aspose.threed import Scene
from aspose.threed.entities import Mesh
scene = Scene.from_file("model.obj")
for node in scene.root_node.child_nodes:
for entity in node.entities:
if isinstance(entity, Mesh):
mesh: Mesh = entity
print(f"Mesh '{node.name}': "
f"{len(mesh.control_points)} vertices, "
f"{len(mesh.polygons)} polygons")
# First vertex position
if mesh.control_points:
v = mesh.control_points[0]
print(f" First vertex: ({v.x:.4f}, {v.y:.4f}, {v.z:.4f})")
# First polygon face (list of control-point indices)
if mesh.polygons:
print(f" First polygon: {mesh.polygons[0]}")mesh.control_points Είναι μια λίστα με Vector4 αντικείμενα ·; x, y, z Να αναλάβει τη θέση και w Ομογενής συντονισμός (συνήθως 1.0) είναι ο ομοιογενείς συντελεστές.
mesh.polygons είναι μια λίστα με τις λίστες των ενσωματωμένων, όπου κάθε εσωτερική λίστας είναι το παραγγελθέντα σύνολο δεικτών σημείων ελέγχου για ένα πρόσωπο.
Βήμα 6: Εφαρμόστε επιλογές φόρτισης ειδικά σε μορφή
Για λεπτό-κλαμμένο έλεγχο του τρόπου ερμηνείας ενός αρχείου OBJ, περάστε ένα ObjLoadOptions Η περίπτωση για scene.open():
from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptions
options = ObjLoadOptions()
options.flip_coordinate_system = True # Convert right-hand Y-up to Z-up
options.scale = 0.01 # Convert centimetres to metres
options.enable_materials = True # Load .mtl material file
options.normalize_normal = True # Normalize all normals to unit length
scene = Scene()
scene.open("model.obj", options)Για τα αρχεία STL, η ισοδύναμη κατηγορία είναι StlLoadOptions.Για το GST, χρησιμοποιήστε GltfLoadOptions.Δείτε το Πυροβολισμοί αναφοράς Για μια πλήρη λίστα.
Κοινά προβλήματα και τακτοποιήσεις
FileNotFoundError όταν καλείτε Scene.from_file()
Ο δρόμος πρέπει να είναι απόλυτος ή σωστός σε σχέση με το εργασιακό κατάλογο στο χρόνο εργασίας. pathlib.Path Για να δημιουργήσουμε αξιόπιστους δρόμους:
from pathlib import Path
from aspose.threed import Scene
path = Path(__file__).parent / "assets" / "model.obj"
scene = Scene.from_file(str(path))mesh.polygons Είναι κενό μετά την φόρτωση ενός αρχείου STL
Τα αρχεία STL αποθηκεύουν τα τριγώνια ως πρώτες πλευρές, όχι μια εντυπωσιακή μάζα. Μετά την φόρτωση, οι πολυγόνοι συνθέτουν από αυτές τις πλευρες. polygons Εμφανίζεται άδεια, ελέγξτε len(mesh.control_points);Αν ο αριθμός είναι πολλαπλό από 3 η γεωμετρία αποθηκεύεται σε μη ενδεικτική μορφή και κάθε διαδοχικό τριγώνιο των κατώτερων σχηματίζει ένα τρίγωνο.
Συντονισμένο σύστημα αδιαφορία (ο μοντέλο εμφανίζεται περιστρεφόμενος ή καθρέφεται)
Διαφορετικά εργαλεία χρησιμοποιούν διαφορετικές συμβάσεις (Y-up vs Z-Up, αριστερά με δεξιά). ObjLoadOptions.flip_coordinate_system = True ή να εφαρμόσει μια περιστροφή στο ρίζον νύχτα του Transform Μετά την φόρτιση.
AttributeError: 'NoneType' object has no attribute 'polygons'
Ο κατάλογος των οντοτήτων ενός κόμβου μπορεί να περιέχει μη-μεσαίες ονόματα (καμερες, φώτα). isinstance(entity, Mesh) Πριν από το casting.
Συχνές ερωτήσεις (FAQ)
Ποια 3D μορφή μπορώ να φορτώσω;?
OBJ (Wavefront), STL (binary και ASCII), glTF 2.0 / GLB, COLLADA (DAE) και 3MF. Η τοκενοποίηση του αρχείου FBX υποστηρίζεται εν μέρει αλλά η πλήρης παρσινγκ δεν είναι ακόμη ολοκληρωμένη.
Το φορτίο ενός αρχείου OBJ είναι επίσης φορτισμένο με το .mtl Υλικό ?
Ναι, όταν ObjLoadOptions.enable_materials = True Η βιβλιοθήκη αναζητά την .mtl Το αρχείο βρίσκεται στο ίδιο κατάλογο με το .obj Ετικέτες: Αν το .mtl Η γεωμετρία εξακολουθεί να είναι φορτισμένη και εκδίδεται προειδοποίηση.
Μπορώ να φορτώ ένα αρχείο από μια ροή byte αντί για έναν δρόμο;?
Ναι . scene.open() Αποδέχεται οποιοδήποτε αντικείμενο όπως το αρχείο με ένα .read() μέθοδος εκτός από μια γραμμή διαδρομής αρχείου. περάσει ένα ανοιχτό δυαδικό ρεύμα (π.χ., io.BytesIOα) απευθείας. Scene.from_file() Αποδέχεται μόνο ένα file path string.
Πώς μπορώ να αποκτήσω φυσιολογικά επιφανειακά;?
Μετά την αποθήκευση, ελέγξτε mesh.get_element(VertexElementType.NORMAL).Αυτό επιστρέφει σε ένα VertexElementNormal Ποιοι data Η λίστα περιέχει ένα κανονικό vector ανά αναφορά, χαρτογραφημένο σύμφωνα με το mapping_mode και reference_mode.
from aspose.threed.entities import Mesh, VertexElementType
normals = mesh.get_element(VertexElementType.NORMAL)
if normals:
print(normals.data[0]) # First normal vectorΕίναι η βιβλιοθήκη ασφαλής για την φόρτωση πολλαπλών αρχείων ταυτόχρονα;?
Κάθε ένα Scene Το αντικείμενο είναι ανεξάρτητο. φορτώντας ξεχωριστά αρχεία σε ξεχώριστα Scene παραδείγματα από ξεχωριστές γραμμές είναι ασφαλής, όσο δεν μοιράζεστε ένα μόνο Scene Μέσα από τις γραμμές χωρίς εξωτερικό κλειδί.