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:
| Primitiva | Descripción |
|---|---|
Box | Caja alineada a los ejes con ancho, altura y profundidad configurables |
Sphere | Esfera paramétrica con radio configurable |
Cylinder | Cilindro 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
| Tipo | Componentes | Precisión | Uso común |
|---|---|---|---|
Vector2 | X, Y | float | coordenadas de textura UV |
Vector3 | X, Y, Z | float | Vector de propósito general de 3 componentes |
Vector4 | X, Y, Z, W | float | Puntos de control, normales |
FVector3 | X, Y, Z | float | Propiedades de transformación (Traslación, Escala) |
FVector4 | X, Y, Z, W | float | Datos 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.