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:
| Primitivo | Descrição |
|---|---|
Box | Caixa alinhada aos eixos com largura, altura e profundidade configuráveis |
Sphere | Esfera paramétrica com raio configurável |
Cylinder | Cilindro 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
| Tipo | Componentes | Precisão | Uso comum |
|---|---|---|---|
Vector2 | X, Y | float | coordenadas de textura UV |
Vector3 | X, Y, Z | float | Vetor de uso geral de 3 componentes |
Vector4 | X, Y, Z, W | float | Pontos de controle, normais |
FVector3 | X, Y, Z | float | Propriedades de transformação (Translação, Escala) |
FVector4 | X, Y, Z, W | float | Dados 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.