Î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
BoxCutie aliniată pe axă cu lățime, înălțime și adâncime configurabile
SphereSferă parametrică cu rază configurabilă
CylinderCilindru 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

TipComponentePrecizieUtilizare comună
Vector2X, Yfloatcoordonatele de textură UV
Vector3X, Y, ZfloatVector cu 3 componente de uz general
Vector4X, Y, Z, WfloatPuncte de control, normale
FVector3X, Y, ZfloatProprietăți de transformare (Translație, Scalare)
FVector4X, Y, Z, WfloatDate 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.