Kā ielādēt 3D modeļus Python
Aspose.3D FOSS for Python nodrošina vienkāršu API 3D failu atvēršanai bez jebkādām vietējām atkarībām. Pēc faila ielādēšanas objektā Scene objektā, jūs varat pārvietoties pa mezglu hierarhiju un nolasīt neapstrādātus ģeometrijas datus katram mesh ainas.
Solī pa solim rokasgrāmata
1. solis: Instalējiet pakotni
Instalējiet Aspose.3D FOSS no PyPI. Nav nepieciešamas papildu sistēmas bibliotēkas.
pip install aspose-3d-fossAtbalstītās Python versijas: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.
2. solis: Importējiet Scene klasi
The Scene klase ir augstākā līmeņa konteineris visiem 3D datiem. Importējiet to kopā ar jebkurām vajadzīgajām ielādes opciju klasēm.
from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptionsVisas publiskās klases atrodas zem aspose.threed vai tās apakšpakotnēm (aspose.threed.entities, aspose.threed.formats, aspose.threed.utilities).
3. solis: Ielādējiet failu
Izmantojiet statisko Scene.from_file() metodi, lai atvērtu jebkuru atbalstītu formātu. Bibliotēka automātiski noteikt formātu no faila paplašinājuma.
##Automatic format detection
scene = Scene.from_file("model.obj")Alternatīvi, izveidojiet Scene instanci un izsauciet open(); noderīgi, ja vēlaties nodot ielādes opcijas vai explicitīgi apstrādāt kļūdas:
scene = Scene()
scene.open("model.obj")Abas metodes atbalsta OBJ, STL (bināro un ASCII), glTF 2.0 / GLB, COLLADA (DAE) un 3MF failus.
4. solis: Pārlūkojiet Scene mezglus
Ielādēta aina ir koks no Node objektiem, kas sakņoti pie scene.root_node. Iterējiet rekursīvi, lai atrastu visus mezglus:
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)Katrs Node var saturēt nulles vai vairāk Entity objektus (tīklu, kameras, gaismas). Pārbaudiet node.entities lai redzētu, kas ir pievienots.
5. solis: Piekļūt virsotņu un daudzstūru datiem
Pārveido mezgla vienību uz Mesh un nolasīt tās kontroles punktus (virsotnes pozīcijas) un daudzstūrus (seju indeksa saraksti):
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 ir saraksts ar Vector4 objektus; x, y, z nēsā pozīciju un w ir homogēnā koordināta (parasti 1.0).
mesh.polygons ir saraksts ar sarakstiem, kas satur veselos skaitļus, kur katrs iekšējais saraksts ir sakārtots kopums ar kontroles punktu indeksiem vienam sejam.
6. solis: Lietot formātam specifiskās ielādes opcijas
Lai iegūtu smalku kontroli pār to, kā tiek interpretēts OBJ fails, nododiet an ObjLoadOptions instanci uz 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)STL failiem ekvivalentā klase ir StlLoadOptions. glTF gadījumā izmantojiet GltfLoadOptions. Skatiet the API atsauce pilnam sarakstam.
Biežāk sastopamās problēmas un to risinājumi
FileNotFoundError izsaucot Scene.from_file()
Ceļam jābūt absolūtam vai pareizi relatīvam attiecībā uz darba direktoriju izpildlaikā. Izmantojiet pathlib.Path lai izveidotu uzticamus ceļus:
from pathlib import Path
from aspose.threed import Scene
path = Path(__file__).parent / "assets" / "model.obj"
scene = Scene.from_file(str(path))mesh.polygons ir tukšs pēc STL faila ielādes
STL faili saglabā trīsstūrus kā neapstrādātus fasetes, nevis indeksētu režģi. Pēc ielādes poligoni tiek sintezēti no šīm fasetēm. Ja polygons izskatās tukšs, pārbaudiet len(mesh.control_points); ja skaitlis ir trīs reizinājums, ģeometrija tiek saglabāta neindeksētā formā, un katrs secīgs trīs virsotņu triples veido vienu trīsstūri.
Koordinātu sistēmas neatbilstība (modelis izskatās pagriezts vai spoguļots)
Dažādi rīki izmanto dažādas konvencijas (Y-augšup pret Z-augšup, kreisā roka pret labo roku). Iestatiet ObjLoadOptions.flip_coordinate_system = True vai piemērot rotāciju saknes mezgla Transform pēc ielādes.
AttributeError: 'NoneType' object has no attribute 'polygons'
Mezgla entītiju saraksts var saturēt ne‑tīklu entītijas (kameras, gaismas). Vienmēr aizsargājiet ar isinstance(entity, Mesh) pirms pārveidošanas.
Biežāk uzdotie jautājumi (BUJ)
Kādus 3D formātus es varu ielādēt?
OBJ (Wavefront), STL (binārais un ASCII), glTF 2.0 / GLB, COLLADA (DAE) un 3MF. FBX faila tokenizācija ir daļēji atbalstīta, bet pilna parsēšana vēl nav pabeigta.
Vai OBJ faila ielāde arī ielādē .mtl materiāls?
Jā, kad ObjLoadOptions.enable_materials = True (noklusējums). Bibliotēka meklē .mtl failu tajā pašā direktorijā kā .obj fails. Ja .mtl trūkst, ģeometrija joprojām tiek ielādēta, un tiek izvadīts brīdinājums.
Vai es varu ielādēt failu no baitu plūsmas, nevis no ceļa?
Jā. scene.open() pieņem jebkuru faila līdzīgu objektu ar .read() metodi papildus faila ceļa virknei. Pārsūtiet atvērtu bināro straumi (piemēram,., io.BytesIO) tieši. Scene.from_file() pieņem tikai faila ceļa virkni.
Kā es varu iegūt virsmas normāles?
Pēc ielādes pārbaudiet mesh.get_element(VertexElementType.NORMAL). Tas atgriež VertexElementNormal kura data saraksts satur vienu normālu vektoru uz atsauci, kartējot saskaņā ar mapping_mode un reference_mode.
from aspose.threed.entities import Mesh, VertexElementType
normals = mesh.get_element(VertexElementType.NORMAL)
if normals:
print(normals.data[0]) # First normal vectorVai bibliotēka ir thread-safe vairāku failu vienlaicīgai ielādei?
Katrs Scene objekts ir neatkarīgs. Atsevišķu failu ielāde atsevišķā Scene instancēm no atsevišķiem pavedieniem ir droši, ja vien jūs neizdalāt vienu Scene pāri pavedieniem bez ārējās bloķēšanas.