Πώς να μετατρέψετε 3D μοντέλα σε Python

Πώς να μετατρέψετε 3D μοντέλα σε Python

Η μετατροπή μορφοποίησης με το Aspose.3D FOSS για Python είναι μια διαδικασία δύο βημάτων: φορτίστε σε ένα Scene αντικείμενο, στη συνέχεια αποθηκεύστε στην επιθυμητή μορφή εκκίνησης. Δεδομένου ότι όλη η γεωμετρία διατηρείται σε μια κοινή αντιπροσωπεία στη μνήμη, δεν απαιτούνται ενδιάμεσες βήματα που αφορούν τη μορφολογία. Τα τμήματα παρακάτω δείχνουν τις πιο κοινές μετατροπές με τον κώδικα εργασίας.

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

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

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

Δεν απαιτούνται βιβλιοθήκες συστήματος, συντάκτες ή πρόσθετες εξαρτήσεις λειτουργίας.


Βήμα 2: Κατεβάστε το μοντέλο πηγής

Χρησιμοποιήστε Scene.from_file() Για την απλούστερη περίπτωση: η μορφή ανιχνεύεται αυτόματα από το αρχείο επέκταση:

from aspose.threed import Scene

scene = Scene.from_file("model.obj")

Για τα αρχεία OBJ όπου χρειάζεστε έλεγχο του συστήματος συντονισμού ή της φόρτωσης υλικού, χρησιμοποιήστε το scene.open() Με ObjLoadOptions:

from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptions

options = ObjLoadOptions()
options.flip_coordinate_system = True  # Convert to Z-up if needed
options.enable_materials = True        # Load the accompanying .mtl file
options.normalize_normal = True

scene = Scene()
scene.open("model.obj", options)

Και οι δύο προσέγγισεις παράγουν ένα πανομοιότυπο Scene Το θέμα είναι το επόμενο βήμα αποθήκευσης.


Βήμα 3: Ελέγξτε την φορτισμένη σκηνή

Πριν δεσμευτείτε για μια μετατροπή, αξίζει να ελέγξετε ότι η γεωμετρία φορτίστηκε σωστά. ένα λείπουν αρχείο, μια μη υποστηριζόμενη λειτουργία FBX ή ένα πρόβλημα με το δρομολόγιο με την επιλογή του .mtl Όλα τα αρχεία μπορούν να παράγουν μια κενή σκηνή.

from aspose.threed import Scene
from aspose.threed.entities import Mesh

scene = Scene.from_file("model.obj")

mesh_count = 0
total_vertices = 0

def count_meshes(node) -> None:
    global mesh_count, total_vertices
    for entity in node.entities:
        if isinstance(entity, Mesh):
            mesh_count += 1
            total_vertices += len(entity.control_points)
    for child in node.child_nodes:
        count_meshes(child)

count_meshes(scene.root_node)
print(f"Loaded {mesh_count} mesh(es), {total_vertices} total vertices")

if mesh_count == 0:
    raise ValueError("Scene contains no geometry: check the source file path and format")

Βήμα 4: Αποθηκεύστε στο Στόχος Τάξη

Κλήση scene.save() Περνάτε ένα συγκεκριμένο σχήμα-επιλογές αποθήκευσης αντικείμενο για τον έλεγχο πάνω από δυαδική vs ASCII εξόδου, συντονισμένες άξες και συμπίεση.

OBJ έως STL (βινική)

from aspose.threed import Scene
from aspose.threed.formats import StlSaveOptions

scene = Scene.from_file("model.obj")

save_opts = StlSaveOptions()
##StlSaveOptions defaults to binary output, which is more compact.

scene.save("model.stl", save_opts)
print("Saved model.stl")

ΟΙ ΠΡΟΤΑΣΕΙΣ ΓΙΑ ΤΟ GLTF 2.0

from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions

scene = Scene.from_file("model.obj")

save_opts = GltfSaveOptions()

scene.save("model.gltf", save_opts)
print("Saved model.gltf")

Για να αποθηκεύσετε ως ένα αυτόνομο GLB δυαδικό αντί για μια .gltf + εξωτερικά μπουφέ, αλλάξτε την επέκταση παραγωγής σε .glb:

scene.save("model.glb", save_opts)

ΟΜΦΙΛΕΙΑ 3MF

from aspose.threed import Scene
from aspose.threed.formats import ThreeMfSaveOptions

scene = Scene.from_file("model.obj")

save_opts = ThreeMfSaveOptions()

scene.save("model.3mf", save_opts)
print("Saved model.3mf")

ΣΤΛ προς ΓΚΛΤΦ 2.0

Το ίδιο πρότυπο ισχύει ανεξάρτητα από τη μορφή πηγής:

from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions

scene = Scene.from_file("input.stl")
scene.save("output.gltf", GltfSaveOptions())
print("Saved output.gltf")

Βήμα 5: Ελέγξτε την έξοδό σας

Μετά την αποθήκευση, επιβεβαιώστε το αρχείο εξόδου υπάρχει και έχει μη-ζώντο μέγεθος. για μια πιο λεπτομερή επαλήθευση , επαναφορτίστε τον και συγκρίνετε τους αριθμούς μασχ:

import os
from aspose.threed import Scene
from aspose.threed.entities import Mesh

output_path = "model.stl"

##Basic file-system check
size = os.path.getsize(output_path)
print(f"Output file size: {size} bytes")
if size == 0:
    raise RuntimeError("Output file is empty: save may have failed silently")

##Round-trip verification: reload and count geometry
def _iter_nodes(node):
    yield node
    for child in node.child_nodes:
        yield from _iter_nodes(child)

reloaded = Scene.from_file(output_path)
mesh_count = sum(
    1
    for node in _iter_nodes(reloaded.root_node)
    for entity in node.entities
    if isinstance(entity, Mesh)
)
print(f"Round-trip check: {mesh_count} mesh(es) in output")

Κοινά προβλήματα και τακτοποιήσεις

Το αρχείο προέλευσης δημιουργείται αλλά δεν περιέχει γεωμετρία.

Το αρχείο προέλευσης μπορεί να έχει φορτωθεί με μηδενικές μασές. Προσθέστε το βήμα ελέγχου από το Βήμα 3 πριν αποθηκεύσετε. Επιπλέον, επιβεβαιώστε ότι η επέκταση αρχείου ταιριάζει στην πραγματική μορφή. Aspose.3D χρησιμοποιεί την επέταση για να επιλέξετε τον διαχωριστή.

Η παραγωγή του GTTF λείπει από κλωστοϋφαντουργίες

Aspose.3D FOSS φέρει γεωμετρία και υλικές ιδιότητες μέσω της μετατροπής. αν η πηγή OBJ αναφέρεται εξωτερικά αρχεία εικόνας στο .mtl,Τα αρχεία εικόνας δεν αντιγράφονται αυτόματα μαζί με το .gltf.Αντιγράψτε τις εικόνες κλωστοϋφαντουργίας στο εγχειρίδιο εξόδου με μη αυτόματο τρόπο μετά την αποθήκευση.

STL εκκίνηση φαίνεται μέσα-εξω (φάντα κανονικά φλιπ)

STL δεν φέρει μεταδεδομένα παραγγελίας βαλβίδας. εάν οι κανονισμοί εξόδου αναστρέφονται, ορίστε StlSaveOptions επιλογές, εάν είναι διαθέσιμες ή να μετακινήσετε το σύστημα συντονισμού κατά τη διάρκεια της φόρτωσης: ObjLoadOptions.flip_coordinate_system = True.

ValueError: unsupported format Όταν η εξοικονόμηση

Ελέγξτε την επέκταση αρχείου εξόδου είναι ένα από τα .obj, .stl, .gltf, .glb, .dae, .3mf.Οι εκτεταμένες είναι ευαίσθητες σε περίπτωση στο Linux.

Πολύ μεγάλα αρχεία προκαλούν αργή μετατροπή

Το Aspose.3D FOSS επεξεργάζεται τη γεωμετρία στη μνήμη. Για τα αρχεία με εκατομμύρια πολυγώνια, εξασφαλίζει επαρκή RAM. Επί του παρόντος δεν υπάρχει API γραμμένου streaming.


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

Μπορώ να μετατρέψω ένα αρχείο χωρίς να το γράφω στο δίσκο πρώτα;?

Ναι και οι δύο scene.open() και scene.save() Αποδέχεται δυαδικά αρχεία-όπως αντικείμενα εκτός από τα μονοπάτια αρχείων. περάστε οποιοδήποτε αντικείμενο που εφαρμόζει read() Για φορτίο ή write() Για την εξοικονόμηση:

import io
from aspose.threed import Scene

# Load from an in-memory buffer
data = open('model.obj', 'rb').read()
scene = Scene()
scene.open(io.BytesIO(data))

# Save to an in-memory buffer
buf = io.BytesIO()
scene.save(buf)

Το FBX υποστηρίζεται ως μορφή πηγής για μετατροπή;?

Η τοκενοποίηση FBX εφαρμόζεται εν μέρει, αλλά ο διαχωριστής δεν είναι πλήρης. η εισαγωγή FB X μπορεί να παράγει ατελείωτες σκηνές. Χρησιμοποιήστε OBJ, STL, glTF, COLLADA ή 3MF ως αξιόπιστα μορφές πηγής.

Θα επιβιώσει η μετατροπή του OBJ-to-glTF;?

Βασικές ιδιότητες υλικού Phong/Lambert (διαφορετικό χρώμα) μεταφέρονται μέσω της Scene μοντέλο και γραμμένο στο υλικό μπλοκ glTF. Διαδικαστικές ή προσαρμοσμένες παραμέτρους σκιών που δεν εκφράζονται στο ύλικό μοντελο gl TF απομακρύνονται.

Μπορώ να μετατρέψω πολλαπλά αρχεία σε ένα κύκλο;?

Ναι, κάθε ένα Scene.from_file() Η κλήση δημιουργεί ένα ανεξάρτητο αντικείμενο, έτσι ώστε μια στροφή πάνω από έναν κατάλογο διαδρομών να είναι απλή:

from pathlib import Path
from aspose.threed import Scene
from aspose.threed.formats import StlSaveOptions

source_dir = Path("input")
output_dir = Path("output")
output_dir.mkdir(exist_ok=True)

opts = StlSaveOptions()
for obj_file in source_dir.glob("*.obj"):
    scene = Scene.from_file(str(obj_file))
    out_path = output_dir / obj_file.with_suffix(".stl").name
    scene.save(str(out_path), opts)
    print(f"Converted {obj_file.name} -> {out_path.name}")

Η μετατροπή διατηρεί την ιεραρχία της σκηνής (πατέρας / παιδικά κόμβους);?

Ναι. Το δέντρο κόμβου διατηρείται όσο το επιτρέπει η μορφή στόχου. Τύποι όπως STL αποθηκεύουν μόνο επίπεδη γεωμετρία χωρίς δομή κόμπων. Η ιεραρχία είναι ελαφριά σε αποθήκευση. Μορφές όπως glTF και COLLADA διαφυλάσσουν την πλήρη ιεραρδία.

 Ελληνικά