Jak načítat 3D modely v Pythonu?

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 ObjLoadOptions

Vš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 vector

Je 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í.

 Čeština