Jak načítat 3D modely v Pythonu?
Aspose.3D FOSS pro Python poskytuje jednoduché API pro otevření 3D souborů bez jakýchkoli nativních závislostí. Po načtení souboru do systému je možné použít aplikaci, která se používá k odhalení dat a zobrazení souboru na webové stránce. Scene Objekt, můžete jít na uzel hierarchii a číst surové geometrické údaje pro každý síť v scéně.
Krok za krokem
Krok 1: Nainstalujte balíček
Instalace Aspose.3D FOSS z PyPI. Žádné další systémové knihovny nejsou zapotřebí.
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
Podporované verze Pythonu: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.
Krok 2: Importovat třídu scény
Úřad pro bezpečnost a ochranu zdraví Scene class je kontejner nejvyšší úrovně pro všechny 3D data. Importovat spolu s jakýmikoliv load-option tříd, které potřebujete.
from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptionsVšechny veřejné třídy žijí pod aspose.threed nebo jeho podbalíčky (aspose.threed.entities, aspose.threed.formats, aspose.threed.utilities).
Krok 3: Nahrát soubor
Použijte statické . Scene.from_file() Knihovna automaticky detekuje formát z rozšíření souboru.
##Automatic format detection
scene = Scene.from_file("model.obj")Alternativně vytvořte Scene příklad a volání open(); užitečné, když chcete přenést možnosti zatížení nebo zcela výslovně vyřešit chyby:
scene = Scene()
scene.open("model.obj")Obě metody podporují soubory OBJ, STL (binární a ASCII), glTF 2.0 / GLB, COLLADA (DAE) a 3MF.
Krok 4: Vstupní uzly scény
Nabitá scéna je stromem… Node objekty zakořeněné v scene.root_node.Iterovat rekurzivně , aby se našli všechny uzly:
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)Každá. Node může nést nulovou nebo vyšší hodnotu Entity předměty (mše, kamery, světla). node.entities - A co je na něm?.
Krok 5: Přístup k údajům o vrcholu a polygonů
Odposlouchejte entitu uzlu k Mesh a číst její kontrolní body (pozice vrcholu) a polygony (seznamy indexu obličeje):
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 je seznam: Vector4 předměty; x, y, z držet pozici a w je homogenní souřadnice (obvykle 1,0).
mesh.polygons je seznam seznamu celých čísel, kde každý vnitřní seznam představuje řádnou sadu kontrolních bodových indexů pro jednu stranu.
Krok 6: Aplikujte možnosti načítání specifické pro formát
Pro jemnou kontrolu nad tím, jak je soubor OBJ interpretován, přejděte na: ObjLoadOptions Příklad: 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)Pro soubory STL je ekvivalentní třídou: StlLoadOptions.Pro glTF použijte: GltfLoadOptions.- Podívejte se na to . Odkaz na API pro úplný seznam.
Obvyklé problémy a řešení
FileNotFoundError při volání Scene.from_file()
Cesta musí být absolutní nebo správná ve vztahu k pracovnímu adresáři v době spuštění. pathlib.Path budovat spolehlivé cesty:
from pathlib import Path
from aspose.threed import Scene
path = Path(__file__).parent / "assets" / "model.obj"
scene = Scene.from_file(str(path))mesh.polygons je po načtení souboru STL prázdný.
STL soubory ukládají trojúhelníky jako surové stránky, ne indexované sítě. Po načtení jsou z těchto stránek syntetizovány polygony. polygons je prázdný, zkontrolujte len(mesh.control_points);Pokud je počet násobek 3 , geometrie se ukládá v neindexované podobě a každý po sobě jdoucí trojitý vrchol tvoří jeden trojúhelník .
Nesoulad souřadnicového systému (model se zobrazuje otočeným nebo zrcadleným)
Různé nástroje používají různá konvence (Y-up vs. Z- up, levá ruka vs pravá). ObjLoadOptions.flip_coordinate_system = True nebo použít rotaci k kořenovému uzlu. Transform po nakládce.
AttributeError: 'NoneType' object has no attribute 'polygons'
Seznam entit node může obsahovat entity mimo meši (kamery, světla). Vždy se hlídej s isinstance(entity, Mesh) před castingem.
Časté otázky (FAQ)
Které 3D formáty můžu načíst?
Obj (Wavefront), STL (binární a ASCII), glTF 2.0 / GLB, COLLADA (DAE) a 3MF. Tokenizace souborů FBX je částečně podporována, ale plné analýzy ještě není dokončeno.
Je načtení souboru OBJ také načítání souborů OBG? .mtl materiály?
Ano, když… ObjLoadOptions.enable_materials = True Knihovna hledá .mtl soubor ve stejném adresáři jako .obj Pokud se v souboru .mtl chybí, geometrie je stále načtená a vydává se varování.
Můžu načíst soubor z byteového proudu místo cesty?
- Ano, jsem.
scene.open()přijímá jakýkoli souborový objekt s.read()Metodou je přidání metody k řetězci cesty souboru.,io.BytesIO) přímo.Scene.from_file()Přijímá pouze řetěz cesty souboru.
Jak se dostanou na povrch?
Po naložení zkontrolujte: mesh.get_element(VertexElementType.NORMAL).To vrací a. VertexElementNormal jehož data Tento seznam obsahuje jeden normální vektor na referenci, mapovaný podle: mapping_mode a) reference_mode.
from aspose.threed.entities import Mesh, VertexElementType
normals = mesh.get_element(VertexElementType.NORMAL)
if normals:
print(normals.data[0]) # First normal vectorJe knižnice pro současné načtení více souborů bezpečná?
Každá. Scene Objekt je nezávislý. Loading separate files into separate Scene instanci z samostatných nití je bezpečné, pokud nesdílíte jediný Scene přes nitky bez vnějšího uzamčení.