En el publicación de introducción, cubrimos qué es Aspose.3D FOSS para .NET y cómo comenzar. Esta publicación profundiza en las características clave que componen la biblioteca, con ejemplos de código para cada área.

Todos los ejemplos asumen la siguiente directiva using:

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

Y el paquete NuGet:

dotnet add package Aspose.3D --version 26.1.0

El grafo de escena

El grafo de escena es la estructura de datos central. Un Scene contiene un RootNode, y cada Node puede tener nodos hijos y un adjunto Entity (como un Mesh o Camera).

Creación y navegación de nodos

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

Adjuntar entidades a nodos

Las entidades son el contenido visual de la escena – mallas, cámaras y luces. Adjúntalas 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");

Primitivas incorporadas

La edición .NET incluye clases de formas paramétricas que generan geometría sin construcción manual de vértices:

PrimitivaDescripción
BoxCaja alineada a los ejes con ancho, altura y profundidad configurables
SphereEsfera paramétrica con radio configurable
CylinderCilindro paramétrico con radios superior/inferior y altura configurables

Estas primitivas pueden adjuntarse directamente a nodos o convertirse en una Mesh a través de ToMesh():

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

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

Construcción de mallas

Si necesitas control total, construye mallas desde cero usando puntos de control y definiciones de polígonos:

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

Puntos de control usan Vector4 con el w componente configurado a 1.0f para posiciones cartesianas estándar. Los polígonos se definen pasando índices de puntos de control a CreatePolygon().

Transformaciones

Cada Node tiene un Transform propiedad que controla su posición local, rotación y 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);

Herencia de Transform

Las transformaciones se componen a través de la jerarquía de la escena. La posición en espacio mundial de un hijo es el producto de todas las transformaciones de los ancestros:

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

El de solo lectura GlobalTransform propiedad en cada Node proporciona la matriz de transformación en espacio mundial calculada después de componer todas las transformaciones de los ancestros. Acceda al resultado mediante node.GlobalTransform.Matrix.

Materiales

La biblioteca incluye tres tipos de material con complejidad creciente:

LambertMaterial

Material clásico solo difuso:

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

Extiende Lambert con reflejos especulares:

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 renderizado basado en la física usado por 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;

Los materiales PBR admiten ranuras de textura para color base, metallic/roughness, normal, emissive y mapas de occlusion mediante propiedades de ruta de textura de tipo cadena.

Utilidades Matemáticas

La biblioteca ofrece un conjunto de primitivas matemáticas para operaciones espaciales 3D:

Tipos de Vector

TipoComponentesPrecisiónUso común
Vector2X, Yfloatcoordenadas de textura UV
Vector3X, Y, ZfloatVector de propósito general de 3 componentes
Vector4X, Y, Z, WfloatPuntos de control, normales
FVector3X, Y, ZfloatPropiedades de transformación (Traslación, Escala)
FVector4X, Y, Z, WfloatDatos del elemento de vértice

Cuaternión

Los cuaterniones representan rotaciones sin bloqueo de cardán:

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

Cajas delimitadoras alineadas a los ejes para consultas espaciales:

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

Elementos de vértice

Las mallas pueden contener capas de datos adicionales por vértice más allá de las posiciones:

  • VertexElementNormal – normales de superficie para cálculos de iluminación.
  • VertexElementUV – coordenadas de textura para mapear imágenes sobre la geometría.
  • VertexElementVertexColor – datos de color RGBA por vértice.

Cada elemento de vértice tiene un MappingMode (por punto de control, por vértice de polígono o por polígono) y un ReferenceMode (valores directos o valores indexados).

Clips de animación

El Scene clase admite clips de animación nombrados a través de CreateAnimationClip() y GetAnimationClip(). En la edición FOSS actual, la creación y búsqueda de clips de animación son funcionales, pero los datos de fotogramas clave y la reproducción aún no están implementados.

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

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

Qué sigue

La siguiente publicación cubre trabajar con formatos de archivo 3D en .NET – una guía práctica, formato por formato, de OBJ, STL, glTF, FBX y 3MF con opciones de carga/guardado y patrones de conversión por lotes.