În postarea de introducere, am acoperit ce este Aspose.3D FOSS pentru .NET și cum să începi. Această postare intră mai adânc în caracteristicile cheie care compun biblioteca, cu exemple de cod pentru fiecare zonă.
Toate exemplele presupun următoarea directivă using:
using Aspose.ThreeD;
using Aspose.ThreeD.Entities;
using Aspose.ThreeD.Shading;
Și pachetul NuGet:
dotnet add package Aspose.3D --version 26.1.0
Graful de scenă
Graful de scenă este structura de date de bază. Un Scene conține un RootNode, și fiecare Node poate avea noduri copil și un atașat Entity (cum ar fi un Mesh sau Camera).
Crearea și navigarea nodurilor
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);
Atașarea entităților la noduri
Entitățile sunt conținutul vizual al scenei – plase, camere și lumini. Atașează-le folosind 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");
Primitive încorporate
Ediția .NET include clase de forme parametrice care generează geometrie fără construcție manuală de vârfuri:
| Primitivă | Descriere |
|---|---|
Box | Cutie aliniată pe axă cu lățime, înălțime și adâncime configurabile |
Sphere | Sferă parametrică cu rază configurabilă |
Cylinder | Cilindru parametric cu raze superioare/inferioare configurabile și înălțime |
Aceste primitive pot fi atașate direct nodurilor sau convertite într-un Mesh prin ToMesh():
var cylinder = new Cylinder(1, 1, 2);
var mesh = cylinder.ToMesh();
Console.WriteLine("Vertices: " + mesh.ControlPoints.Count);
Console.WriteLine("Polygons: " + mesh.PolygonCount);
Construcția de mesh-uri
Dacă ai nevoie de control total, construiește mesh-uri de la zero folosind puncte de control și definiții de poligoane:
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");
Punctele de control utilizează Vector4 cu w componenta setată la 1.0f pentru poziții carteziene standard. Poligoanele sunt definite prin transmiterea indicilor punctelor de control către CreatePolygon().
Transformări
Fiecare Node are un Transform proprietate care controlează poziția, rotația și scala locală:
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);
Moștenire a Transformărilor
Transformările se compun prin ierarhia scenei. Poziția unui copil în spațiul mondial este produsul tuturor transformărilor ale strămoșilor:
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
Proprietatea numai în citire GlobalTransform proprietate pe fiecare Node furnizează matricea de transformare în spațiu mondial calculată după compunerea tuturor transformărilor strămoșe. Accesați rezultatul prin node.GlobalTransform.Matrix.
Materiale
Biblioteca include trei tipuri de materiale cu complexitate crescătoare:
LambertMaterial
Material clasic doar difuz:
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
Extinde Lambert cu reflexii speculare:
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
Material de redare bazat pe fizică utilizat de 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;
Materialele PBR suportă sloturi de texturi pentru culoare de bază, metallic/roughness, normală, emisie și hărți de ocluzie prin proprietăți de tip șir de cale a texturii.
Utilitare Matematice
Biblioteca oferă un set de primitive matematice pentru operații spațiale 3D:
Tipuri de Vectori
| Tip | Componente | Precizie | Utilizare comună |
|---|---|---|---|
Vector2 | X, Y | float | coordonatele de textură UV |
Vector3 | X, Y, Z | float | Vector cu 3 componente de uz general |
Vector4 | X, Y, Z, W | float | Puncte de control, normale |
FVector3 | X, Y, Z | float | Proprietăți de transformare (Translație, Scalare) |
FVector4 | X, Y, Z, W | float | Date ale elementului de vârf |
Quaternion
Quaternioni reprezintă rotații fără blocaj 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
Cutii de delimitare aliniate pe axe pentru interogări spațiale:
// BoundingBox stores Minimum and Maximum FVector3 corners
// Used for frustum culling and spatial partitioning
Elemente de vârf
Mesh-urile pot conține straturi suplimentare de date per-vertex în afara pozițiilor:
- VertexElementNormal – normale de suprafață pentru calculele de iluminare.
- VertexElementUV – coordonate de textură pentru maparea imaginilor pe geometrie.
- VertexElementVertexColor – date de culoare RGBA per-vertex.
Fiecare element de vârf are un MappingMode (pe punct de control, pe vârf de poligon sau pe poligon) și un ReferenceMode (valori directe sau valori indexate).
Clipuri de animație
Clasa Scene clasa suportă clipuri de animație denumite prin CreateAnimationClip() și GetAnimationClip(). În ediția FOSS curentă, crearea și căutarea clipurilor de animație sunt funcționale, dar datele cadrelor cheie și redarea nu sunt încă implementate.
var scene = new Scene();
var clip = scene.CreateAnimationClip("Walk");
// Retrieve by name
var found = scene.GetAnimationClip("Walk");
Console.WriteLine("Clip found: " + (found != null));
Ce urmează
Următorul articol acoperă lucrul cu formatele de fișiere 3D în .NET – un ghid practic, format-cu-format pentru OBJ, STL, glTF, FBX și 3MF, cu opțiuni de încărcare/salvare și modele de conversie în lot.