Hur man laddar 3D-modeller i Python
Aspose.3D FOSS för Python ger en enkel API för att öppna 3D-filer utan några inhemska beroende. Scene objekt, kan du gå nöthierarkin och läsa rågeometriska data för varje mesh i scenen.
Steg för steg guide
Steg 1: Installera paketet
Installera Aspose.3D FOSS från PyPI. Inga ytterligare systembibliotek krävs.
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
Stödda versioner av Python: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.
Steg 2: Importera scenen klass
Den Scene klass är den toppnivåbehållaren för alla 3D-data. Importera det tillsammans med alla laddningsalternativ klasser du behöver.
from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptionsAlla offentliga klasser lever under aspose.threed eller dess underförpackningar (aspose.threed.entities, aspose.threed.formats, aspose.threed.utilities).
Steg 3: Ladda upp en fil
Använd statisk Scene.from_file() Metoden för att öppna något stöds format. biblioteket upptäcker formatet automatiskt från filändelsen.
##Automatic format detection
scene = Scene.from_file("model.obj")Alternativt, skapa en Scene Instans och kallelse open();Användbar när du vill passera laddningsalternativ eller hantera fel uttryckligen:
scene = Scene()
scene.open("model.obj")Båda metoderna stöder OBJ, STL (binär och ASCII), glTF 2.0 / GLB, COLLADA (DAE) och 3MF filer.
Steg 4: Övergång Scene Nodes
En laddad scen är ett träd av Node föremål som är rötta i scene.root_node.Iterat återkommande för att hitta alla knappar:
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)Varje Node kan bära noll eller mer Entity objekt (mässa, kameror, ljus) Kontrollera node.entities att se vad som är kopplat till.
Steg 5: Tillgång till Vertex och Polygon Data
Hämta en node entitet till Mesh och läs dess kontrollpunkter (vertexpositioner) och polygoner (fackindexlistor):
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 Det är en lista över Vector4 föremål →; x, y, z Ta den position och w Det är den homogena koordinaten (vanligtvis 1.0).
mesh.polygons är en lista över integratorer, där varje inre lista är den ordnade uppsättningen av kontrollpunktsindex för ett ansikte.
Steg 6: Tillämpa format-specifika laddningsalternativ
För fingrined kontroll över hur en OBJ-fil tolkas, gå in i ett ObjLoadOptions Exempel på att 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)För STL-filer är motsvarande klass StlLoadOptions.För gltf, användning GltfLoadOptions.Se den API referens För en fullständig lista.
Vanliga problem och fixar
FileNotFoundError när du ringer Scene.from_file()
Vägen måste vara absolut eller korrekt i förhållande till arbetsdirektivet på löptid. pathlib.Path Att bygga pålitliga vägar:
from pathlib import Path
from aspose.threed import Scene
path = Path(__file__).parent / "assets" / "model.obj"
scene = Scene.from_file(str(path))mesh.polygons är tom efter att ha laddat en STL-fil
STL-filer lagrar trianglar som råfacetter, inte en indexerad mesh. Efter laddning syntetiseras polygoner från dessa facetter. polygons Det är tomt, kolla in len(mesh.control_points);Om räkningen är ett multiplikat av 3 lagras geometern i en icke-indexerad form och varje efterföljande trippel av vertikaler bildar en enda triangel.
Systemets koordinat missmatch (modellen visas roterad eller speglar)
Olika verktyg använder olika konventioner (Y-up vs Z-ups, vänster hand vs höger hand). ObjLoadOptions.flip_coordinate_system = True eller applicera en rotation på rötnoden Transform efter laddning.
AttributeError: 'NoneType' object has no attribute 'polygons'
En nodens entitetlista kan innehålla icke-mesh entiteter (kameror, lampor). alltid se till att isinstance(entity, Mesh) innan kastningen.
Ofta ställda frågor (FAQ)
Vilka 3D-format kan jag ladda?
OBJ (Wavefront), STL (binär och ASCII), glTF 2.0 / GLB, COLLADA (DAE) och 3MF. FBX-filer tokeniseras delvis men fullständig parsning är ännu inte komplett.
Ladda en OBJ-fil också ladda den .mtl materialet ?
Ja, när ObjLoadOptions.enable_materials = True (det föreskrivna) Biblioteket söker efter .mtl filer i samma katalog som .obj filen. om den .mtl är saknad, geometern är fortfarande laddad och en varning utfärdas.
Kan jag ladda en fil från en byteflöde istället för en väg?
Ja ja . scene.open() accepterar alla filliknande objekt med en .read() Metod förutom en filvägssträng. Passera ett öppet binärt flöde (t.ex., io.BytesIOdirekt från . Scene.from_file() accepterar endast en filvägssträng.
Hur får jag ytnormer?
Efter laddning, kontrollera mesh.get_element(VertexElementType.NORMAL).Detta återvänder till A VertexElementNormal Vem som data listan innehåller en normal vektor per referens, kartläggd enligt mapping_mode och reference_mode.
from aspose.threed.entities import Mesh, VertexElementType
normals = mesh.get_element(VertexElementType.NORMAL)
if normals:
print(normals.data[0]) # First normal vectorÄr biblioteket trådsäker för att ladda flera filer samtidigt?
Varje Scene objekt är oberoende. Ladda upp separata filer till separerade Scene instanser från separata trådar är säkra så länge du inte delar en enda Scene över trådar utan extern lås.