Kako učitati 3D modele u Python
Aspose.3D FOSS za Python pruža jednostavan API za otvaranje 3D fajlova bez ikakvih nativnih zavisnosti. Nakon učitavanja fajla u Scene objekat, možete preći kroz hijerarhiju čvorova i pročitati sirove geometrijske podatke za svaki mesh u sceni.
Vodič korak po korak
Korak 1: Instalirajte paket
Instalirajte Aspose.3D FOSS sa PyPI. Nije potrebna nijedna dodatna sistemska biblioteka.
pip install aspose-3d-fossPodržane Python verzije: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.
Korak 2: Uvezite klasu Scene
Klasa Scene klasa je kontejner najvišeg nivoa za sve 3D podatke. Uvezite je zajedno sa svim klasama za opcije učitavanja koje su vam potrebne.
from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptionsSve javne klase se nalaze pod aspose.threed ili njegovim podpaketima (aspose.threed.entities, aspose.threed.formats, aspose.threed.utilities).
Korak 3: Učitajte fajl
Koristite statičku Scene.from_file() metodu za otvaranje bilo kog podržanog formata. Biblioteka automatski otkriva format na osnovu ekstenzije fajla.
##Automatic format detection
scene = Scene.from_file("model.obj")Alternativno, kreirajte Scene instancu i pozovite open(); korisno kada želite da prosledite opcije učitavanja ili eksplicitno obradite greške:
scene = Scene()
scene.open("model.obj")Oba metoda podržavaju OBJ, STL (binarni i ASCII), glTF 2.0 / GLB, COLLADA (DAE) i 3MF fajlove.
Korak 4: Prođite kroz čvorove Scene
Učitana scena je stablo od Node objekata čiji koren je scene.root_node. Rekurzivno iterirajte da biste pronašli sve čvorove:
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)Svaki Node može imati nula ili više Entity objekti (mreže, kamere, svetla). Proveri node.entities da vidiš šta je prikačeno.
Korak 5: Pristup podacima o vrhovima i poligonima
Pretvori entitet čvora u Mesh i pročitaj njegove kontrolne tačke (pozicije vrhova) i poligone (liste indeksa površina):
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 lista Vector4 objekata; x, y, z nose poziciju i w je homogena koordinata (obično 1.0).
mesh.polygons je lista listi celih brojeva, gde je svaka unutrašnja lista uređeni skup indeksa kontrolnih tačaka za jedno lice.
Korak 6: Primena opcija učitavanja specifičnih za format
Za finu kontrolu nad tim kako se OBJ fajl interpretira, prosledite ObjLoadOptions instancu 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)Za STL fajlove, ekvivalentna klasa je StlLoadOptions. Za glTF, koristite GltfLoadOptions. Pogledajte API referencu za kompletnu listu.
Uobičajeni problemi i rešenja
FileNotFoundError prilikom poziva Scene.from_file()
Putanja mora biti apsolutna ili ispravna relativna u odnosu na radni direktorijum u vreme izvršavanja. Koristite pathlib.Path za izgradnju pouzdanih putanja:
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 prazan nakon učitavanja STL fajla
STL fajlovi čuvaju trouglove kao sirove fasete, a ne indeksiranu mrežu. Nakon učitavanja, poligoni se sintetizuju iz tih faseta. Ako polygons se čini praznim, proverite len(mesh.control_points); ako je broj višekratnik od 3, geometrija je pohranjena u neindeksiranom obliku i svaki uzastopni trojac temena formira jedan trougao.
Neusklađenost koordinatnog sistema (model izgleda rotiran ili zrcaljen)
Različiti alati koriste različite konvencije (Y‑gore naspram Z‑gore, leva ruka naspram desne ruke). Postavite ObjLoadOptions.flip_coordinate_system = True ili primeniti rotaciju na korenski čvor Transform nakon učitavanja.
AttributeError: 'NoneType' object has no attribute 'polygons'
Lista entiteta čvora može da sadrži entitete koji nisu mreže (kamere, svetla). Uvek proverite pre isinstance(entity, Mesh) pre kastovanja.
Često postavljana pitanja (FAQ)
Koje 3D formate mogu da učitam?
OBJ (Wavefront), STL (binarni i ASCII), glTF 2.0 / GLB, COLLADA (DAE) i 3MF. Tokenizacija FBX fajla je delimično podržana, ali potpuna parsiranje još nije završeno.
Da li učitavanje OBJ fajla takođe učitava .mtl materijal?
Da, kada ObjLoadOptions.enable_materials = True (podrazumevano). Biblioteka traži the .mtl datoteka u istom direktorijumu kao i .obj datoteka. Ako .mtl nedostaje, geometrija se i dalje učitava i izbacuje se upozorenje.
Mogu li učitati fajl iz bajt toka umesto iz putanje?
Da. scene.open() prihvata bilo koji objekat sličan datoteci sa .read() metodom pored stringa putanje do datoteke. Proslijedite otvoreni binarni tok (npr., io.BytesIO) direktno. Scene.from_file() prihvata samo string putanje do datoteke.
Kako da dobijem površinske normale?
Nakon učitavanja, proverite mesh.get_element(VertexElementType.NORMAL). Ovo vraća VertexElementNormal čiji data lista sadrži jedan normalni vektor po referenci, mapiran prema mapping_mode i reference_mode.
from aspose.threed.entities import Mesh, VertexElementType
normals = mesh.get_element(VertexElementType.NORMAL)
if normals:
print(normals.data[0]) # First normal vectorDa li je biblioteka thread-safe za učitavanje više fajlova istovremeno?
Svaki Scene objekat je nezavisan. Učitavanje odvojenih fajlova u odvojene Scene instance iz odvojenih niti su bezbedne sve dok ne delite jedan Scene preko niti bez spoljnog zaključavanja.