Hur man konverterar 3D-modeller till Python
Format konvertering med Aspose.3D FOSS för Python är en tvåstegs process: ladda in i ett Scene objekt, spara sedan till önskad utgångsformat. Eftersom all geometri hålls i en gemensam in-minnespresentation behövs inga formatpecifika mellansteg. Avdelningarna nedan visar de vanligaste omvandlingarna med arbetskod.
Steg för steg guide
Steg 1: Installera paketet
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
Inga systembibliotek, kompiler eller ytterligare drifttidsberoende krävs.
Steg 2: Ladda upp källmodellen
Användning Scene.from_file() för det enklaste fallet: formatet upptäcks automatiskt från filändelsen:
from aspose.threed import Scene
scene = Scene.from_file("model.obj")För OBJ-filer där du behöver kontroll över koordinatsystemet eller materialladdning, använd scene.open() med 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)Båda metoderna ger en identisk Scene för att föra det efterföljande spara steget.
Steg 3: Kontrollera den laddade scenen
Innan du gör en omvandling, är det värt att kontrollera att geometern laddas korrekt. En saknad fil, en oupphörlig FBX-funktion eller ett vägsproblem med en .mtl Alla filer kan producera en tom scen.
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")Steg 4: Spara till målet format
Ringa till scene.save() Passera ett format-specifik spara alternativ objekt för kontroll över binära vs ASCII utgång, koordinat axlar och kompression.
OBJ till STL (binär)
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")OBJ till 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")Spara som en självinnehållad GLB binär istället för en .gltf + externa buffrar, ändra utgångsförlängningen till .glb:
scene.save("model.glb", save_opts)OBJ till 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")STL till glTF 2.0
Samma mönster gäller oavsett källformat:
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")Steg 5: Kontrollera utgången
Efter spara, bekräfta utgångsfilen finns och har en icke-zero storlek. För mer noggrann kontroll, ladda upp den och jämföra mäs räkningar:
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")Vanliga problem och fixar
Utgångsfilen är skapad men innehåller ingen geometri
Källfilen kan ha laddat med nollmässa. Lägg till inspektörsteg från Steg 3 innan spara. Bekräfta också att filutvidden matchar det faktiska formatet; Aspose.3D använder utvidgningen för att välja parser.
GTTF-produktionen saknar texturer
Aspose.3D FOSS bär geometri och materialegenskaper genom omvandling. Om källan OBJ refererar till externa bildfiler i .mtl, dessa bildfiler kopieras inte automatiskt bredvid .gltf.Kopiera texturbilder till utgångsdirektivet manuellt efter spara.
STL utgång ser inuti och ut (flicka normala flipped)
STL bär inte metadata för vindbeställning. om utgångsnormerna är inverterade, ställ in StlSaveOptions alternativ om tillgängliga, eller flip koordinatsystemet under laddning: ObjLoadOptions.flip_coordinate_system = True.
ValueError: unsupported format När spara
Kontrollera utgångsfil förlängning är en av .obj, .stl, .gltf, .glb, .dae, .3mf.Extensioner är fallsensitiva på Linux.
Mycket stora filer orsakar långsam konvertering
Aspose.3D FOSS behandlar geometri i minnet. För filer med miljoner polygoner, säkerställer tillräckligt RAM. Det finns för närvarande ingen streaming-skrivande API.
Ofta ställda frågor (FAQ)
Kan jag konvertera en fil utan att skriva den till disk först?
Ja, båda två scene.open() och scene.save() acceptera binära filliknande objekt utöver filvägar. passera alla objekt som implementerar read() för laddning eller write() För att spara:
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)Är FBX stöds som ett källformat för konvertering?
FBX tokenisering är delvis implementerad, men parserna är inte färdiga. FBx-inträde kan producera ofullständiga scener. Använd OBJ, STL, glTF, COLLADA eller 3MF som tillförlitliga källformat.
Kommer material att överleva en OBJ-till-glTF omvandling?
Grundläggande Phong/Lambert materialegenskaper (diffusfärg) bäras genom Scene Modellen och skrivs i materialblocket glTF. Procedurella eller anpassade skugga parametrar som inte kan uttryckas i gltf-materialmodellen dras ner.
Kan jag konvertera flera filer i en loop?
Ja, var och en Scene.from_file() Call skapar ett oberoende objekt, så en runda över en lista med vägar är enkel:
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}")Bevar omvandlingen scenen hierarki (föräldrarna/barn noderna)?
Ja. Noden är bevarad så långt som målsformat tillåter. Formater som STL lagrar endast platt geometri utan nodestruktur; hierarkin är flätad på spara. Format som glTF och COLLADA behåller den fullständiga hierarki.