No post de introdução, cobrimos o que Aspose.3D FOSS para .NET é e como começar. Este post aprofunda os recursos principais que compõem a biblioteca, com exemplos de código para cada área.

Todos os exemplos assumem a seguinte diretiva using:

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

E o pacote NuGet:

dotnet add package Aspose.3D --version 26.1.0

O Grafo de Cena

O grafo de cena é a estrutura de dados central. Um Scene contém um RootNode, e todo Node pode ter nós filhos e um anexo Entity (como um Mesh ou Camera).

Criando e Navegando Nós

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

Anexando Entidades a Nós

Entidades são o conteúdo visual da cena – malhas, câmeras e luzes. Anexe-as 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

A edição .NET inclui classes de formas paramétricas que geram geometria sem construção manual de vértices:

PrimitivoDescrição
BoxCaixa alinhada aos eixos com largura, altura e profundidade configuráveis
SphereEsfera paramétrica com raio configurável
CylinderCilindro paramétrico com raios superior/inferior e altura configuráveis

Esses primitivos podem ser anexados diretamente a nós ou convertidos em um 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);

Construção de Mesh

Se precisar de controle total, construa meshes do zero usando pontos de controle e definições 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");

Pontos de controle usam Vector4 com o w componente definido como 1.0f para posições cartesianas padrão. Polígonos são definidos passando índices de pontos de controle para CreatePolygon().

Transformações

Cada Node tem um Transform propriedade que controla sua posição local, rotação e 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);

Herança de Transformação

As transformações são compostas através da hierarquia da cena. A posição em espaço mundial de um filho é o produto de todas as transformações ancestrais:

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

A somente leitura GlobalTransform propriedade em cada Node fornece a matriz de transformação no espaço mundial calculada após compor todas as transformações ancestrais. Acesse o resultado via node.GlobalTransform.Matrix.

Materiais

A biblioteca inclui três tipos de material com complexidade crescente:

LambertMaterial

Material clássico apenas 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

Estende Lambert com realces 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 renderização baseada em 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;

Materiais PBR suportam slots de textura para cor base, metalicidade/aspereza, normal, emissiva e mapas de oclusão via propriedades de caminho de textura em string.

Utilitários Matemáticos

A biblioteca fornece um conjunto de primitivas matemáticas para operações espaciais 3D:

Tipos de Vetor

TipoComponentesPrecisãoUso comum
Vector2X, Yfloatcoordenadas de textura UV
Vector3X, Y, ZfloatVetor de uso geral de 3 componentes
Vector4X, Y, Z, WfloatPontos de controle, normais
FVector3X, Y, ZfloatPropriedades de transformação (Translação, Escala)
FVector4X, Y, Z, WfloatDados do elemento de vértice

Quaternion

Quaternions representam rotações sem bloqueio 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

Caixas delimitadoras alinhadas aos eixos para consultas espaciais:

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

Elementos de Vértice

Malhas podem conter camadas adicionais de dados por vértice além das posições:

  • VertexElementNormal – normais de superfície para cálculos de iluminação.
  • VertexElementUV – coordenadas de textura para mapear imagens na geometria.
  • VertexElementVertexColor – dados de cor RGBA por vértice.

Cada elemento de vértice tem um MappingMode (por ponto de controle, por vértice de polígono ou por polígono) e um ReferenceMode (valores diretos ou valores indexados).

Clipes de Animação

O Scene classe suporta clipes de animação nomeados via CreateAnimationClip() e GetAnimationClip(). Na edição FOSS atual, a criação e a busca de clipes de animação são funcionais, mas os dados de quadros‑chave e a reprodução ainda não foram implementados.

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

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

Próximos passos

O próximo post cobre trabalhando com formatos de arquivo 3D em .NET – um guia prático, formato a formato, para OBJ, STL, glTF, FBX e 3MF com opções de carregamento/salvamento e padrões de conversão em lote.