Jak zbudować 3D Mesh z Aspose.3D w Pythonie

Jak zbudować 3D Mesh z Aspose.3D w Pythonie

Aspose.3D FOSS dla Pythona pozwala na budowanie geometrii 3D w całości w kodzie: nie jest wymagane zewnętrzne narzędzie do modelowania. Mesh,Wystarczy, że zlokalizuj go w pozycji vertex (control_pointsi wskazywanie definicji (polygons), przypisz opcjonalne atrybuty z góry, takie jak normalne, a następnie przechowuj sceny do dowolnego obsługiwanego formatu.

Przewodnik krok po kroku

Krok 1: Instalacja pakietu

Instaluj Aspose.3D FOSS z PyPI. Nie wymagane są native extensions ani kompiler toolchain.

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

Sprawdź instalację:

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

Wspierane wersje Pythona: 3.7, 3.8, 3.9, 3.10, 3.11, 3.12.


Krok 2: Tworzenie sceny i nodu

Każda z nich musi żyć w grafiku scenicznym. Scene Dodaj nazwę Node Aby zachować myszę:

from aspose.threed import Scene

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

Nazwa nodu jest przechowywana w eksportowanym pliku i jest przydatna do odbioru i późniejszej odzyskania przez node.get_child("triangle").


Krok 3: Tworzenie obiektu Mesh

Natychmiast A Mesh Opcjonalne nazwy opisowe:

from aspose.threed.entities import Mesh

mesh = Mesh("triangle")

Mysz jest początkowo pusty: bez pionów, bez poligonu.


Krok 4: Dodaj punkty sterowania (wersje)

Punkty kontrolne to pozycje z góry.Każdy z nich jest przechowywany jako Vector4(x, y, z, w) gdzie w=1 Wskazywanie punktu w przestrzeni 3D:

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)}")

Ważne : Wystarczymesh.control_points Powrót A Kopiowanie z listy wewnętrznej (gitter executes) list(self._control_points)) wzywając mesh.control_points.append(v) przykleja się do kopii, a nie do maszyny, więc podłoga jest cicho odrzucona. zawsze używać mesh._control_points.append(v) do dodania pionów. dostęp do państwa prywatnego poprzez _control_points jest znany pracownik; interfejs może ulec zmianie w przyszłej wersji biblioteki.


Krok 5: Tworzenie poligonu twarzy

Definicja topologii twarzy za pomocą wskaźników vertex. create_polygon().Trzy wskaźniki wytwarzają trójkąt, cztery wytwarza kwad:

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

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

Dla kwadratowej maszyny przechodzisz przez cztery wskaźniki: mesh.create_polygon(0, 1, 2, 3).

Wskaźniki muszą być ważnymi pozycjami w control_points (0-bazowany, w zakresie). porządek windy jest kontr-godzinny dla norm zewnętrznych.


Krok 6: Dodaj normy Vertex

Normalne warstwy są przechowywane jako VertexElement przywiązane do maszyny. użyj mesh.create_element() z VertexElementType.NORMAL, MappingMode.CONTROL_POINT,i 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 To normalne na jeden vertek. ReferenceMode.DIRECT oznacza, że normalne dane są odczytane w tym samym porządku jak punkty kontrolne (bez dodatkowego bufera indeksu).

Normalne wektory FVector4(x, y, z, w) z w=0 Wskazywać kierunek zamiast pozycję. FVector4 jest wektorem płynnym o jednorazowej dokładności; dane atrybutowe VertexElementFVector Podklaski wykorzystują ten rodzaj.


Krok 7: Przyłącz masę do węzła i zaoszczędzaj

Dodaj do przycisku, a następnie zaoszczędzaj scenę:

node.add_entity(mesh)

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

Pełny scenariusz pracy (wszystkie kroki połączone):

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")

wspólne kwestie

kwestiaRezolucja
IndexError w create_polygonSprawdź, czy wszystkie dane są w range(len(mesh.control_points)).Wskaźniki są oparte na 0.
Eksport z nule pionówmesh.control_points.append(...) cichy odrzucają pion, ponieważ nieruchomość zwraca kopię. użyj mesh._control_points.append(...) Zamiast tego.
Liczba normalna nie odpowiada liczbie vertex.Kiedy używać MappingMode.CONTROL_POINT + ReferenceMode.DIRECT, normals.data Muszą mieć dokładnie len(control_points) Wejście .
Mesh brakuje z zapisanych plikówPotwierdź to node.add_entity(mesh) Wcześniej nazywano scene.save().Masz nieprzywiązany do żadnego węzła nie jest eksportowany.
Nieprawidłowy porządek wędrówki (oblicze wydaje się niewidoczne)Zegarowy porządek z zamknięciem wytwarza normę zewnętrzną. create_polygon Aby go flip.
polygon_count Powrót 0polygon_count Czytaj ten sam listę jak polygons.Jeśli create_polygon Nie było żadnych rozmów, lista jest pusta.
Normy są nieprawidłowe w widzowieUpewnij się, że wszystkie normalne wektory są długością jednostki. n / abs(n) lub przechodzić wartości wstępnie normalizowane.

Często zadawane pytania

Jaka jest różnica między Vector3 i Vector4 Po punkcie kontroli?

control_points Sklepy Vector4 Obiekty - przedmiot w Składnik jest koordynacją homogenną: użycie w=1 w pozycji vertex oraz w=0 wektorów kierunkowych, takich jak normy. Vector3 Jest używany do transformacji (tłumaczenia, skalowania), ale nie do przechowywania geometrii.

Czy mogę zbudować mesz z kwadami zamiast trójkąta?

Tak, zadzwoń mesh.create_polygon(0, 1, 2, 3) Niektóre cele oszczędzania (STL, 3MF) wymagają trójkąta i będą automatycznie triangulować kwady. glTF i COLLADA zachowują kwad.

Jak dodać koordynaty UV?

Używanie mesh.create_element_uv(TextureMapping.DIFFUSE, MappingMode.POLYGON_VERTEX) Aby stworzyć A VertexElementUV w kanałach rozproszonych, a następnie popołudniamy ich data Lista z Vector4 Wprowadzenie: Używanie koordynatów UV x i y; z i w Zazwyczaj jest to argument, który musi być pierwszym argumentem. TextureMapping stały (np. w przypadku., TextureMapping.DIFFUSE1) określając, do jakiej tekstury należy warstwa UV.

Czy masza potrzebuje normalnych do prawidłowego eksportu?

Normy są opcjonalne. jeśli nie, większość widzów oblicza normy na twarzy z polygonu porządku wibracji. Dodanie wyraźnych norm per-vertex powoduje gładkie odcienie.

Czy mogę dodać kilka łokci do jednego węzła?

Tak, zadzwoń node.add_entity(mesh) każde połączenie dodaje nową jednostkę do node.entities.Niektóre formaty mogą rozkładać kilka podmiotów w jeden na eksporcie.

Jak trójkątnie zmieszam się z mieszanymi typami poligonu?

Wzywaj mesh.triangulate() Konwertuj wszystkie kwady i N-gony na trójkąty w miejscu. to jest przydatne przed oszczędzaniem do formatów, które tylko obsługują trzecie.

 Polski