W poście wprowadzającym, omówiliśmy, czym jest Aspose.3D FOSS dla .NET i jak rozpocząć. Ten post zagłębia się w kluczowe funkcje tworzące bibliotekę, z przykładami kodu dla każdego obszaru.
Wszystkie przykłady zakładają następującą dyrektywę using:
using Aspose.ThreeD;
using Aspose.ThreeD.Entities;
using Aspose.ThreeD.Shading;
I pakiet NuGet:
dotnet add package Aspose.3D --version 26.1.0
Graf sceny
Graf sceny jest podstawową strukturą danych. A Scene zawiera RootNode, i każdy Node może mieć węzły potomne i dołączony Entity (takich jak Mesh lub Camera).
Tworzenie i nawigacja po węzłach
var scene = new Scene();
// Create a hierarchy
var parent = scene.RootNode.CreateChildNode("Parent");
var child1 = parent.CreateChildNode("Child1");
var child2 = parent.CreateChildNode("Child2");
// Navigate the tree
Console.WriteLine("Root children: " + scene.RootNode.ChildNodes.Count);
Console.WriteLine("Parent children: " + parent.ChildNodes.Count);
Dołączanie encji do węzłów
Encje są wizualną zawartością sceny – siatkami, kamerami i światłami. Dołącz je używając CreateChildNode:
var scene = new Scene();
// Create a box primitive and attach it to the scene
var box = new Box(2, 2, 2);
var boxNode = scene.RootNode.CreateChildNode("BoxNode", box);
// Create a sphere primitive
var sphere = new Sphere(1);
var sphereNode = scene.RootNode.CreateChildNode("SphereNode", sphere);
scene.Save("primitives.gltf");
Wbudowane prymitywy
Edycja .NET zawiera klasy kształtów parametrycznych, które generują geometrię bez ręcznego konstruowania wierzchołków:
| Prymityw | Opis |
|---|---|
Box | Prostopadłościan wyrównany do osi z konfigurowalną szerokością, wysokością i głębokością |
Sphere | Sfera parametryczna z konfigurowalnym promieniem |
Cylinder | Cylinder parametryczny z konfigurowalnymi promieniami górnym/dolnym i wysokością |
Te prymitywy mogą być dołączane bezpośrednio do węzłów lub konwertowane na Mesh za pomocą ToMesh():
var cylinder = new Cylinder(1, 1, 2);
var mesh = cylinder.ToMesh();
Console.WriteLine("Vertices: " + mesh.ControlPoints.Count);
Console.WriteLine("Polygons: " + mesh.PolygonCount);
Konstrukcja siatki
Jeśli potrzebujesz pełnej kontroli, buduj siatki od podstaw, używając punktów kontrolnych i definicji wielokątów:
var mesh = new Mesh();
// Add vertex positions
mesh.ControlPoints.Add(new Vector4(0, 0, 0, 1.0f));
mesh.ControlPoints.Add(new Vector4(1, 0, 0, 1.0f));
mesh.ControlPoints.Add(new Vector4(0.5f, 1, 0, 1.0f));
// Define a triangle face
mesh.CreatePolygon(0, 1, 2);
// Attach to a scene
var scene = new Scene();
scene.RootNode.CreateChildNode("triangle", mesh);
scene.Save("triangle.stl");
Punkty kontrolne używają Vector4 z w zestaw komponentu ustawiony na 1.0f dla standardowych pozycji kartezjańskich. Wielokąty są definiowane przez przekazywanie indeksów punktów kontrolnych do CreatePolygon().
Transformacje
Każdy Node ma Transform właściwość, która kontroluje jej lokalną pozycję, rotację i skalę:
var scene = new Scene();
var node = scene.RootNode.CreateChildNode("Moved");
node.Transform.Translation = new FVector3(5, 0, 0);
node.Transform.Scale = new FVector3(2, 2, 2);
Dziedziczenie Transformacji
Transformacje są składane w hierarchii sceny. Pozycja dziecka w przestrzeni świata jest wynikiem mnożenia wszystkich transformacji przodków:
var scene = new Scene();
var parent = scene.RootNode.CreateChildNode("Parent");
parent.Transform.Translation = new FVector3(10, 0, 0);
var child = parent.CreateChildNode("Child");
child.Transform.Translation = new FVector3(5, 0, 0);
// Child's world position is (15, 0, 0)
// Access via child.GlobalTransform
GlobalTransform
Tylko do odczytu GlobalTransform właściwość na każdym Node zapewnia obliczoną macierz transformacji w przestrzeni światowej po złożeniu wszystkich transformacji przodków. Uzyskaj wynik za pomocą node.GlobalTransform.Matrix.
Materiały
Biblioteka zawiera trzy typy materiałów o rosnącej złożoności:
LambertMaterial
Klasyczny materiał jedynie dyfuzyjny:
var material = new LambertMaterial("WoodMaterial");
material.Diffuse = new Vector4(0.6f, 0.4f, 0.2f, 1.0f);
material.Ambient = new Vector4(0.1f, 0.1f, 0.1f, 1.0f);
material.Transparency = 0.0f;
PhongMaterial
Rozszerza Lambert o refleksy spekularne:
var material = new PhongMaterial("ShinyMetal");
material.Specular = new Vector4(0.8f, 0.8f, 0.8f, 1.0f);
material.Shininess = 50.0f;
material.SpecularPower = 32.0f;
PbrMaterial
Materiał renderingu opartego na fizyce używany w glTF 2.0:
var material = new PbrMaterial("GoldPBR");
material.BaseColor = new Vector4(1.0f, 0.8f, 0.2f, 1.0f);
material.Metallic = 0.9f;
material.Roughness = 0.1f;
material.Occlusion = 1.0f;
Materiały PBR obsługują sloty tekstur dla koloru bazowego, metaliczności/szorstkości, normalnej, emisji i mapy zacienienia poprzez właściwości ścieżek tekstur jako ciągi znaków.
Narzędzia Matematyczne
Biblioteka udostępnia zestaw prymitywów matematycznych do operacji przestrzennych 3D:
Typy Wektorów
| Typ | Komponenty | Precyzja | Typowe zastosowanie |
|---|---|---|---|
Vector2 | X, Y | float | Współrzędne tekstury UV |
Vector3 | X, Y, Z | float | Wektor ogólnego przeznaczenia składający się z 3 komponentów |
Vector4 | X, Y, Z, W | float | Punkty kontrolne, normalne |
FVector3 | X, Y, Z | float | Właściwości transformacji (przesunięcie, skalowanie) |
FVector4 | X, Y, Z, W | float | Dane elementu wierzchołka |
Quaternion
Kwaterniony reprezentują obroty bez blokady gimbal:
var rotation = new Quaternion(0, 0, 0, 1); // Identity
node.Transform.Rotation = rotation;
Matrix4
4x4 transformation matrices for composing transforms:
// Matrix operations are used internally by Transform
// and GlobalTransform for world-space computation
BoundingBox
Prostopadłe pudełka ograniczające wyrównane do osi dla zapytań przestrzennych:
// BoundingBox stores Minimum and Maximum FVector3 corners
// Used for frustum culling and spatial partitioning
Elementy wierzchołka
Siatki mogą zawierać dodatkowe warstwy danych per-wierzchołkowych poza pozycjami:
- VertexElementNormal – normalne powierzchni do obliczeń oświetlenia.
- VertexElementUV – współrzędne tekstury do mapowania obrazów na geometrię.
- VertexElementVertexColor – dane koloru RGBA per-wierzchołkowe.
Każdy element wierzchołka ma MappingMode (na punkt kontrolny, na wierzchołek wielokąta lub na wielokąt) i ReferenceMode (wartości bezpośrednie lub wartości indeksowane).
Klipy animacji
Ten Scene class obsługuje nazwane klipy animacji za pomocą CreateAnimationClip() i GetAnimationClip(). W bieżącej edycji FOSS tworzenie i wyszukiwanie klipów animacji działa, ale dane klatek kluczowych oraz odtwarzanie nie zostały jeszcze zaimplementowane.
var scene = new Scene();
var clip = scene.CreateAnimationClip("Walk");
// Retrieve by name
var found = scene.GetAnimationClip("Walk");
Console.WriteLine("Clip found: " + (found != null));
Co dalej
Następny post omawia pracę z formatami plików 3D w .NET – praktyczny przewodnik format po formacie po OBJ, STL, glTF, FBX i 3MF z opcjami ładowania/zapisu oraz wzorcami konwersji wsadowej.