Jak vytvořit 3D síť s Aspose.3D v Pythonu

Jak vytvořit 3D síť s Aspose.3D v Pythonu

Aspose.3D FOSS pro Python vám umožňuje vytvořit 3D geometrii zcela v kódu: není potřeba externí modelovací nástroj. Vytváříte si Mesh, vyplnit jej pozicemi vrcholu (control_points) a definice obličeje (polygons), připojte volitelné atributy vrcholu, jako jsou normály a pak ukládáte scénu do jakéhokoli podporovaného formátu.

Krok za krokem

Krok 1: Nainstalujte balíček

Instalace Aspose.3D FOSS z PyPI. Žádné nativní rozšíření nebo řetězec nástrojů kompilátoru není zapotřebí.

asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.

Ověřte instalaci:

from aspose.threed import Scene
print("Aspose.3D FOSS ready")

Podporované verze Pythonu: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.


Krok 2: Vytvořte scénu a uzel

Každý meč musí být uvnitř scénového grafu. Scene a přidat jmenovaný Node pro držení okna:

from aspose.threed import Scene

scene = Scene()
node = scene.root_node.create_child_node("triangle")

Jméno uzlu je uchováno v exportovaném souboru a je užitečné pro debugging a pozdější získání prostřednictvím: node.get_child("triangle").


Krok 3: Vytvořte objekt sítě

Zobrazit a. Mesh s volitelným popisním názvem:

from aspose.threed.entities import Mesh

mesh = Mesh("triangle")

Metu je zpočátku prázdná: žádné vrcholy, žádný mnohoúhelníky. Vyplníte ji v následujících krocích.


Krok 4: Přidání kontrolních bodů (křivek)

Kontrolní body jsou pozice vrcholu. Každý vrchol je uložen jako Vector4(x, y, z, w) kde: w=1 označuje bod ve 3D prostoru:

from aspose.threed.utilities import Vector4

##Vertex 0: origin
# Note: control_points returns a copy of the internal vertex list.
# Appending to the returned copy discards the vertex silently.
# Use _control_points to mutate the backing list directly.
# This is a known library limitation — a public add_control_point() API is not yet available.
mesh._control_points.append(Vector4(0.0, 0.0, 0.0, 1.0))

##Vertex 1: 1 unit along X
mesh._control_points.append(Vector4(1.0, 0.0, 0.0, 1.0))

##Vertex 2: apex
mesh._control_points.append(Vector4(0.5, 1.0, 0.0, 1.0))

print(f"Vertices added: {len(mesh.control_points)}")

Důležité: Česká republikamesh.control_points vrací a Kopie ze seznamu vnitřních vrcholů (getter provádí list(self._control_points)) Volání mesh.control_points.append(v) Přidává se k kopii, ne ke sítce, takže vrchol je tichě vyloučen. mesh._control_points.append(v) Přístup k soukromému stavu prostřednictvím _control_points je známý řešení; rozhraní se může změnit v budoucí verzi knihovny.


Krok 5: Vytvořte polygonové tváře

Definice topologie obličeje pomocí indexů vrcholů. Přeneste indixy vrcholu na create_polygon().Tři indexy tvoří trojúhelník , čtyři - čtvercový .:

##Triangle: connect vertices 0 → 1 → 2
mesh.create_polygon(0, 1, 2)

print(f"Polygon count: {mesh.polygon_count}")

Pro čtyřdílnou síť byste prošli 4 indexy: mesh.create_polygon(0, 1, 2, 3).

Indikáty musí být platné pozice v control_points (v rozsahu 0), pro normály s výstupem do vnějšího směru je řád zvlnění proti směry hodinových ručiček.


Krok 6: Přidání normálních vertexů

Normální vrcholy jsou uloženy jako VertexElement Použijte: mesh.create_element() s: VertexElementType.NORMAL, MappingMode.CONTROL_POINT,a) ReferenceMode.DIRECT:

from aspose.threed.entities import VertexElementType, MappingMode, ReferenceMode, VertexElementNormal
from aspose.threed.utilities import Vector4, FVector4

##Create the normal element (returns VertexElementNormal, a VertexElementFVector subclass)
normals: VertexElementNormal = mesh.create_element(
    VertexElementType.NORMAL,
    MappingMode.CONTROL_POINT,
    ReferenceMode.DIRECT
)

##One normal per vertex: all pointing out of the XY plane (0, 0, 1)
normals.set_data([
    FVector4(0, 0, 1, 0),   # vertex 0
    FVector4(0, 0, 1, 0),   # vertex 1
    FVector4(0, 0, 1, 0),   # vertex 2
])

print("Normal layer attached.")

MappingMode.CONTROL_POINT znamená jeden normál na vrchol. ReferenceMode.DIRECT znamená, že běžné údaje jsou čteny ve stejném pořadí jako kontrolní body (bez dalšího indexového nárazníku).

Použití běžných vektorů FVector4(x, y, z, w) s: w=0 označit směr spíše než polohu. FVector4 je jednopřesný floatový vektor; údaje o atributu vrcholu v VertexElementFVector Podtřídy používají tento typ.


Krok 7: Připojte síť k uzlu a ukládáte

Přidejte síť k uzlu a pak uložte scénu:

node.add_entity(mesh)

scene.save("triangle.gltf")
print("Saved triangle.gltf")

Kompletní pracovní scénář (všechny kroky dohromady):

from aspose.threed import Scene
from aspose.threed.entities import Mesh, VertexElementType, MappingMode, ReferenceMode, VertexElementNormal
from aspose.threed.utilities import Vector3, Vector4, FVector4

scene = Scene()
node = scene.root_node.create_child_node("triangle")

mesh = Mesh("triangle")

##Add 3 vertices (x, y, z, w)
# Use _control_points to mutate the backing list directly (control_points returns a copy)
mesh._control_points.append(Vector4(0.0, 0.0, 0.0, 1.0))
mesh._control_points.append(Vector4(1.0, 0.0, 0.0, 1.0))
mesh._control_points.append(Vector4(0.5, 1.0, 0.0, 1.0))

##Create a triangle polygon
mesh.create_polygon(0, 1, 2)

##Add normals (create_element returns VertexElementNormal, a VertexElementFVector subclass)
normals: VertexElementNormal = mesh.create_element(VertexElementType.NORMAL, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT)
normals.set_data([
    FVector4(0, 0, 1, 0),
    FVector4(0, 0, 1, 0),
    FVector4(0, 0, 1, 0),
])

node.add_entity(mesh)
scene.save("triangle.gltf")

Obvyklé problémy

Výše:Rozhodnutí
IndexError v . create_polygonOvěřte, zda jsou všechny indexy v rámci: range(len(mesh.control_points)).Indikátory jsou založeny na nule.
Vývoz s nulovými vrcholy pro trámové pásymesh.control_points.append(...) tiše odmítá vrcholy, protože vlastnost vrací kopii. Použijte mesh._control_points.append(...) Místo toho.
Počet normálů se nesrovnává s počtem vrcholů.Při použití: MappingMode.CONTROL_POINT + ReferenceMode.DIRECT, normals.data Musí to být přesně tak. len(control_points) záznamy.
Zde není soubor sítě .Potvrďte to. node.add_entity(mesh) Byl jsem předvolán. scene.save().Ošety, které nejsou připojeny k žádnému uzlu, se nevyvážejí.
Nesprávný řád zvitku (tvář je neviditelná)Pořadí vrcholu v opačném směru hodinových ručiček vytváří normál, který je obrácen. create_polygon - Přepnout to.
polygon_count Zpětná hodnota 0polygon_count čte se stejný seznam jako polygons.Pokud . create_polygon nebyl volal, seznam je prázdný.
Normální se objeví v divákovi.Ujistěte se, že všechny normální vektory jsou jednotkové délky. Vypočítaj s n / abs(n) nebo předcházet přednormálním hodnotám.

Časté otázky

Jaký je rozdíl mezi Vector3 a) Vector4 pro kontrolní body?

control_points obchodní zařízení Vector4 Předměty. w složka je homogenní souřadnice: použití w=1 pro pozice vrcholu a w=0 pro směrové vektory, jako jsou normály. Vector3 Používá se pro transformy (překlad, měřítko), ale ne pro ukládání geometrie.

Můžu postavit síť s čtyřkolkami místo trojúhelníků?

Ano, zavolejte. mesh.create_polygon(0, 1, 2, 3) Některé cíle (STL, 3MF) vyžadují trojúhelníky a automaticky triangulaci čtyřkolníků. glTF a COLLADA zachovat štvorkolník .

Jak přidám UV souřadnice?

Použití: mesh.create_element_uv(TextureMapping.DIFFUSE, MappingMode.POLYGON_VERTEX) vytvořit VertexElementUV pro difúzní kanál, pak naplňte jeho data seznam s Vector4 UV souřadnice používání x a) y; z a) w jsou obvykle 0. První argument musí být a. TextureMapping konstantní (např., TextureMapping.DIFFUSE) s identifikací texturního pásu, do kterého patří UV vrstva.

Potřebuje síť normální, aby se správně vyvážela?

Ne. Normály jsou volitelné. Pokud je vynecháte, většina diváků vypočítá normály na povrch z poligonového zvitkování. Přidáním explicitních normalek pro vrchol vytváří hladší stínění.

Můžu do jednoho uzlu přidat více sítí?

Ano, zavolejte. node.add_entity(mesh) Každý volání přidává novou entitu k node.entities.Některé formáty mohou při vývozu ztisknout více subjektů do jednoho.

Jak triangulaci sítě se smíšenými polygony?

Zavolej . mesh.triangulate() To je užitečné před uložením do formátů, které podporují pouze trojúhelníky.

 Čeština