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
| kwestia | Rezolucja |
|---|---|
IndexError w create_polygon | Sprawdź, czy wszystkie dane są w range(len(mesh.control_points)).Wskaźniki są oparte na 0. |
| Eksport z nule pionów | mesh.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ów | Potwierdź 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 0 | polygon_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 widzowie | Upewnij 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.