Trabalhando com o Grafo de Cena

Trabalhando com o Grafo de Cena

Trabalhando com o Grafo de Cena

Cada cena 3D em Aspose.3D para .NET é organizada como uma árvore de Node objetos. Scene.RootNode é a raiz dessa árvore e cada peça de geometria, material e transformação vive sob ela como filho ou descendente.


Criando a Cena e Acessando o Nó Raiz

Scene é inicializado automaticamente com um nó raiz chamado "RootNode":

using Aspose.ThreeD;

var scene = new Scene();
Node root = scene.RootNode; // always "RootNode"

Adicionando Nós Filhos

Call CreateChildNode() em qualquer nó para adicionar um filho. O método tem três sobrecargas comumente usadas:

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

var scene = new Scene();
Node root = scene.RootNode;

// 1. Named node with no entity — useful as a pivot or transform container
Node pivot = root.CreateChildNode("pivot");

// 2. Named node with an entity
var box = new Box(2, 2, 2);
Node boxNode = root.CreateChildNode("box", box);

// 3. Named node with entity and material
var mat = new Aspose.ThreeD.Shading.PhongMaterial("red");
mat.Diffuse = new Vector4(0.8, 0.2, 0.2, 1.0);
Node decorated = pivot.CreateChildNode("red_box", box, mat);

Para anexar um nó construído separadamente, use AddChildNode():

var detached = new Node("standalone");
root.AddChildNode(detached);

Consultando Nós Filhos

Encontre um filho direto por nome ou por índice, ou itere todos os filhos diretos:

// By name — returns null if no direct child has that name
Node? found = root.GetChild("box");
if (found != null)
    Console.WriteLine("Found: " + found.Name);

// By index
Node first = root.GetChild(0);

// Iterate all direct children
foreach (Node child in root.ChildNodes)
    Console.WriteLine(child.Name);

GetChild(string name) procura apenas filhos diretos, não a subárvore completa. Use um auxiliar recursivo ou Accept() para pesquisar toda a árvore.


Percorrendo a Árvore Completa

Para uma travessia completa em profundidade, itere ChildNodes recursivamente:

static void Walk(Node node, int depth = 0)
{
    Console.WriteLine(new string(' ', depth * 2) + node.Name);
    foreach (var child in node.ChildNodes)
        Walk(child, depth + 1);
}

Walk(scene.RootNode);

Para travessia com saída antecipada, node.Accept(NodeVisitor) está disponível e chama o visitante em cada descendente até que o visitante retorne false.


Usando Group para Organizar Objetos Relacionados

Group é uma entidade contêiner que organiza logicamente os nós sem adicionar geometria. Anexe‑a a um nó cujos filhos representam uma unidade lógica:

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

var scene = new Scene();

// A group node for all furniture in a room
var furnitureGroup = new Group("furniture");
Node roomNode = scene.RootNode.CreateChildNode("living_room", furnitureGroup);

// Child nodes under the group node
Node sofaNode  = roomNode.CreateChildNode("sofa",         new Box(3, 1, 1));
Node tableNode = roomNode.CreateChildNode("coffee_table", new Box(2, 0.5, 1));

Movendo roomNode transforma todos os móveis juntos porque os filhos herdam seu Transform.


Controlando Visibilidade e Exclusão na Exportação

Os nós podem ser ocultados ou excluídos da exportação sem serem removidos da hierarquia:

Node ground = scene.RootNode.CreateChildNode("ground_plane", new Box(100, 0.1, 100));
ground.Visible = false;       // hidden in viewport / renderer

Node helperNode = scene.RootNode.CreateChildNode("debug_arrow", new Box());
helperNode.Excluded = true;   // omitted from all export operations

Visible = false é uma dica de exibição. Excluded = true impede que o nó apareça em arquivos exportados independentemente do formato.


Anexando Múltiplas Entidades a Um Nó

Um nó tem um primário entidade (Entity propriedade), mas pode conter entidades adicionais através AddEntity(). Isso é útil quando diferentes partes da malha compartilham uma única transformação:

var bodyMesh  = new Mesh("body");
var wheelMesh = new Mesh("wheel");

Node carNode = scene.RootNode.CreateChildNode("car");
carNode.AddEntity(bodyMesh);
carNode.AddEntity(wheelMesh);

// Retrieve all entities on this node
foreach (Entity ent in carNode.Entities)
    Console.WriteLine(ent.GetType().Name + ": " + ent.Name);

Mesclando Nós

Merge() move todos os filhos, entidades e materiais de um nó de origem para o nó de destino. O nó de origem fica vazio:

Node lod0 = scene.RootNode.CreateChildNode("lod0");
lod0.CreateChildNode("mesh_high", new Box(1, 1, 1));

Node lod1 = scene.RootNode.CreateChildNode("lod1");
lod1.CreateChildNode("mesh_low", new Box(1, 1, 1));

// Consolidate lod0 children into lod1
lod1.Merge(lod0);
// lod1 now has both mesh_high and mesh_low; lod0 is empty

Próximas Etapas


Referência Rápida da API

MembroDescrição
scene.RootNodeRaiz da árvore de cena; sempre presente após new Scene()
node.CreateChildNode(name)Criar um nó filho nomeado sem entidade
node.CreateChildNode(name, entity)Criar um nó filho nomeado com uma entidade
node.CreateChildNode(name, entity, material)Criar um nó filho nomeado com entidade e material
node.AddChildNode(node)Anexar um construído separadamente Node
node.GetChild(name)Encontrar um filho direto pelo nome; retorna null se não encontrado
node.GetChild(index)Obter o filho direto em um índice dado
node.ChildNodesIList<Node> de todos os filhos diretos
node.Accept(visitor)Percorra este nó e todos os descendentes em profundidade primeiro
node.AddEntity(entity)Anexe uma entidade adicional ao nó
node.EntitiesIList<Entity> de todas as entidades neste nó
node.VisibleMostrar ou ocultar o nó
node.ExcludedIncluir ou excluir o nó da exportação
node.Merge(other)Mover todos os filhos e entidades de other para este nó
new Group(name)Entidade contêiner para agrupar logicamente nós filhos
 Português