Nel post introduttivo, abbiamo coperto cosa è Aspose.3D FOSS per .NET e come iniziare. Questo post approfondisce le funzionalità chiave che compongono la libreria, con esempi di codice per ogni area.

Tutti gli esempi presumono la seguente direttiva using:

using Aspose.ThreeD;
using Aspose.ThreeD.Entities;
using Aspose.ThreeD.Shading;

E il pacchetto NuGet:

dotnet add package Aspose.3D.Converter --version 1.0.0

Il grafo della scena

Il grafo della scena è la struttura dati principale. A Scene contiene un RootNode, e ogni Node può avere nodi figli e un allegato Entity (ad esempio un Mesh o Camera).

Creazione e navigazione dei nodi

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

Allegare le Entity ai nodi

Le entità sono il contenuto visivo della scena – mesh, telecamere e luci. Collegale usando 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 integrate

L’edizione .NET include classi di forme parametriche che generano geometria senza costruzione manuale dei vertici:

PrimitivoDescrizione
BoxScatola allineata agli assi con larghezza, altezza e profondità configurabili
SphereSfera parametrica con raggio configurabile
CylinderCilindro parametrico con raggi superiore/inferiore configurabili e altezza

Queste primitive possono essere collegate direttamente ai nodi o convertite in una Mesh tramite ToMesh():

var cylinder = new Cylinder(1, 1, 2);
var mesh = cylinder.ToMesh();

Console.WriteLine("Vertices: " + mesh.ControlPoints.Count);
Console.WriteLine("Polygons: " + mesh.PolygonCount);

Costruzione del Mesh

Se hai bisogno di pieno controllo, costruisci i mesh da zero usando punti di controllo e definizioni di poligoni:

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

I punti di controllo usano Vector4 con il w componente impostato su 1.0f per posizioni cartesiane standard. I poligoni sono definiti passando gli indici dei punti di controllo a CreatePolygon().

Trasformazioni

Ogni Node ha un Transform proprietà che controlla la sua posizione locale, rotazione e scala:

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

Eredità delle trasformazioni

Le trasformazioni si compongono attraverso la gerarchia della scena. La posizione in spazio mondiale di un figlio è il prodotto di tutte le trasformazioni dei suoi antenati:

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

La proprietà di sola lettura GlobalTransform sui singoli Node fornisce la matrice di trasformazione nello spazio mondiale calcolata dopo aver composto tutte le trasformazioni dei genitori. Accedi al risultato tramite node.GlobalTransform.Matrix.

Materiali

La libreria include tre tipi di materiale con complessità crescente:

LambertMaterial

Materiale classico solo diffuso:

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

Estende Lambert con riflessi speculari:

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

Materiale di rendering basato sulla fisica usato da 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;

I materiali PBR supportano slot di texture per colore di base, metallicità/ruvidità, normale, emissiva e mappe di occlusione tramite proprietà di percorso di texture stringa.

Utility Matematiche

La libreria fornisce un insieme di primitive matematiche per operazioni spaziali 3D:

Tipi di Vettore

TipoComponentiPrecisioneUso comune
Vector2X, Yfloatcoordinate texture UV
Vector3X, Y, ZfloatVettore a 3 componenti di uso generale
Vector4X, Y, Z, WfloatPunti di controllo, normali
FVector3X, Y, ZfloatProprietà di trasformazione (Traslazione, Scala)
FVector4X, Y, Z, WfloatDati degli elementi del vertice

Quaternion

Quaternions rappresentano rotazioni senza gimbal lock:

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

BoundingBox allineati agli assi per query spaziali:

// BoundingBox stores Minimum and Maximum FVector3 corners
// Used for frustum culling and spatial partitioning

Elementi Vertex

Meshes possono contenere livelli di dati aggiuntivi per vertice oltre alle posizioni:

  • VertexElementNormal – normali di superficie per i calcoli di illuminazione.
  • VertexElementUV – coordinate di texture per mappare le immagini sulla geometria.
  • VertexElementVertexColor – dati di colore RGBA per vertice.

Ogni elemento del vertice ha un MappingMode (per punto di controllo, per vertice del poligono o per poligono) e un ReferenceMode (valori diretti o valori indicizzati).

Animation Clips

La Scene classe supporta clip di animazione nominate tramite CreateAnimationClip() e GetAnimationClip(). Nell’edizione FOSS attuale, la creazione e la ricerca di clip di animazione sono funzionali, ma i dati dei fotogrammi chiave e la riproduzione non sono ancora implementati.

var scene = new Scene();
var clip = scene.CreateAnimationClip("Walk");

// Retrieve by name
var found = scene.GetAnimationClip("Walk");
Console.WriteLine("Clip found: " + (found != null));

Cosa segue

Il prossimo post tratta lavorare con i formati di file 3D in .NET – una guida pratica, formato per formato, a OBJ, STL, glTF, FBX e 3MF con opzioni di caricamento/salvataggio e modelli di conversione batch.