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_polygon | Ověř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ásy | mesh.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 0 | polygon_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.