En el publicació d’introducció, vam cobrir què és Aspose.3D FOSS per a .NET i com començar. Aquesta publicació aprofundeix en les característiques clau que conformen la biblioteca, amb exemples de codi per a cada àrea.

Tots els exemples assumeixen la següent directiva using:

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

I el paquet NuGet:

dotnet add package Aspose.3D --version 26.1.0

El gràfic d’escena

El graf de l’escena és l’estructura de dades central. Un Scene conté un RootNode, i cada Node pot tenir nodes fills i un adjunt Entity (com ara un Mesh o Camera).

Creació i navegació de nodes

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

Adjunció d’entitats a nodes

Les entitats són el contingut visual de l’escena – malles, càmeres i llums. Adjunta-les mitjançant 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");

Primitius integrats

L’edició .NET inclou classes de formes paramètriques que generen geometria sense construcció manual de vèrtexs:

PrimitiuDescripció
BoxCaixa alineada amb els eixos amb amplada, alçada i profunditat configurables
SphereEsfera paramètrica amb radi configurable
CylinderCilindre paramètric amb radis superior/inferior configurables i alçada

Aquestes primitives es poden adjuntar directament a nodes o convertir en una Mesh via ToMesh():

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

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

Construcció de malla

Si necessiteu control total, construïu malles des de zero utilitzant punts de control i definicions de polígons:

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

Els punts de control utilitzen Vector4 amb el w component establert a 1.0f per a posicions cartesianes estàndard. Els polígons es defineixen passant índexs de punts de control a CreatePolygon().

Transformacions

Cada Node té un Transform propietat que controla la seva posició local, rotació i escala:

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

Herència de Transformacions

Les transformacions es componen a través de la jerarquia de l’escena. La posició en l’espai mundial d’un fill és el producte de totes les transformacions dels avantpassats:

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 de només lectura GlobalTransform propietat a cada Node proporciona la matriu de transformació en l’espai mundial calculada després de composar totes les transformacions dels avantpassats. Accediu al resultat mitjançant node.GlobalTransform.Matrix.

Materials

La biblioteca inclou tres tipus de material amb una complexitat creixent:

LambertMaterial

Material clàssic només difús:

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

Amplia Lambert amb reflexos especulars:

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 renderització basat en la física utilitzat per 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;

Els materials PBR admeten ranures de textures per al color base, metàl·lic/aspresa, normal, emissiu i mapes d’occlusió mitjançant propietats de ruta de textura de cadena.

Utilitats Matemàtiques

La biblioteca ofereix un conjunt de primitives matemàtiques per a operacions espacials 3D:

Tipus de Vectors

TipusComponentsPrecisióÚs comú
Vector2X, Yfloatcoordenades de textura UV
Vector3X, Y, ZfloatVector de 3 components d’ús general
Vector4X, Y, Z, WfloatPunts de control, normals
FVector3X, Y, ZfloatPropietats de transformació (Desplaçament, Escala)
FVector4X, Y, Z, WfloatDades d’element de vèrtex

Quaternió

Els quaternions representen rotacions sense bloqueig de cardan:

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

Caixes delimitadores alineades amb els eixos per a consultes espacials:

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

Elements de vèrtex

Les malles poden portar capes de dades addicionals per vèrtex més enllà de les posicions:

  • VertexElementNormal – normals de superfície per a càlculs d’il·luminació.
  • VertexElementUV – coordenades de textura per a mapar imatges sobre la geometria.
  • VertexElementVertexColor – dades de color RGBA per vèrtex.

Cada element de vèrtex té un MappingMode (per punt de control, per vèrtex de polígon o per polígon) i un ReferenceMode (valors directes o valors indexats).

Clips d’animació

El Scene classe admet clips d’animació amb nom a través de CreateAnimationClip() i GetAnimationClip(). En l’edició FOSS actual, la creació i la cerca de clips d’animació són funcionals, però les dades de fotogrames clau i la reproducció encara no s’han implementat.

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

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

Què ve a continuació

La propera publicació cobreix treballar amb formats de fitxer 3D a .NET – una guia pràctica, format per format, d’OBJ, STL, glTF, FBX i 3MF amb opcions de càrrega/descarrega i patrons de conversió per lots.