Trabalhando com o Grafo de Cena
Trabalhando com o Grafo de Cena
Cada cena 3D em Aspose.3D para Java é organizada como uma árvore de Node objetos. Scene fornece uma única raiz — getRootNode() — e cada peça de geometria, material e transformação vive sob essa raiz como um nó filho ou descendente.
Criando a Cena e Acessando o Nó Raiz
Scene inicializa automaticamente com um nó raiz chamado "RootNode":
import com.aspose.threed.Scene;
import com.aspose.threed.Node;
Scene scene = new Scene();
Node root = scene.getRootNode(); // always "RootNode"Adicionando Nós Filhos
Chame createChildNode() em qualquer nó para adicionar um filho. O método tem três sobrecargas comumente usadas:
import com.aspose.threed.*;
Scene scene = new Scene();
Node root = scene.getRootNode();
// 1. Named node with no entity — useful as a pivot or group container
Node pivot = root.createChildNode("pivot");
// 2. Named node with an entity
Mesh mesh = new Mesh("box");
mesh.getControlPoints().add(new Vector4(0, 0, 0));
mesh.getControlPoints().add(new Vector4(1, 0, 0));
mesh.getControlPoints().add(new Vector4(1, 1, 0));
mesh.getControlPoints().add(new Vector4(0, 1, 0));
mesh.createPolygon(0, 1, 2, 3);
Node meshNode = root.createChildNode("box", mesh);
// 3. Named node with entity and material
PbrMaterial mat = new PbrMaterial("red");
mat.setAlbedo(new Vector4(0.8f, 0.2f, 0.2f, 1.0f));
Node decorated = pivot.createChildNode("red_box", mesh, mat);Para anexar um nó que foi construído separadamente, use addChildNode():
Node 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) {
System.out.println("Found: " + found.getName());
}
// By index
Node first = root.getChild(0);
// Iterate all direct children
for (Node child : root.getChildNodes()) {
System.out.println(child.getName());
}getChild(String name) procura apenas filhos diretos, não a subárvore completa. Use accept() para pesquisar toda a árvore.
Percorrendo a Árvore Completa
node.accept(NodeVisitor) percorre um nó e todos os seus descendentes em ordem de profundidade primeiro. O visitante retorna true para continuar ou false para interromper antecipadamente:
import com.aspose.threed.NodeVisitor;
// Print every node name in the scene
scene.getRootNode().accept(n -> {
System.out.println(n.getName());
return true; // false would stop traversal
});
// Stop after finding the first node that has an entity
final Node[] found = {null};
scene.getRootNode().accept(n -> {
if (n.getEntity() != null) {
found[0] = n;
return false; // stop walking
}
return true;
});NodeVisitor é uma interface de método único, portanto aceita uma lambda em Java 8+.
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 = root.createChildNode("ground_plane", mesh);
ground.setVisible(false); // hidden in viewport / renderer
Node helperNode = root.createChildNode("debug_arrow", mesh);
helperNode.setExcluded(true); // omitted from all export operationssetVisible(false) é uma dica de exibição. setExcluded(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 (getEntity() / setEntity()), mas pode conter entidades adicionais através de addEntity(). Isso é útil quando diferentes peças de malha compartilham uma única transformação:
Mesh body = new Mesh("body");
Mesh wheel = new Mesh("wheel");
Node carNode = root.createChildNode("car");
carNode.addEntity(body);
carNode.addEntity(wheel);
// Retrieve all entities on this node
for (Entity ent : carNode.getEntities()) {
System.out.println(ent.getName());
}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 = root.createChildNode("lod0");
lod0.createChildNode("mesh_high", mesh);
Node lod1 = root.createChildNode("lod1");
lod1.createChildNode("mesh_low", mesh);
// Consolidate lod0 children into lod1
lod1.merge(lod0);
// lod1 now has both mesh_high and mesh_low; lod0 is emptyPróximas Etapas
- Aplicando Transformações — posicionar, girar e escalar qualquer nó usando seu
Transform - Criando e Trabalhando com Malhas — construir geometria poligonal e anexá‑la aos nós
Referência Rápida da API
| Membro | Descrição |
|---|---|
scene.getRootNode() | Raiz da árvore de cena; sempre presente após new Scene() |
node.createChildNode(name) | Crie um nó filho nomeado sem entidade |
node.createChildNode(name, entity) | Crie um nó filho nomeado com uma entidade |
node.createChildNode(name, entity, material) | Crie um nó filho nomeado com entidade e material |
node.addChildNode(node) | Anexe um construído separadamente Node |
node.getChild(name) | Encontre um filho direto pelo nome; retorna null se não encontrado |
node.getChild(index) | Obtenha o filho direto em um índice especificado |
node.getChildNodes() | List<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.getEntities() | List<Entity> de todas as entidades neste nó |
node.setVisible(bool) | Mostrar ou ocultar o nó |
node.setExcluded(bool) | Incluir ou excluir o nó da exportação |
node.merge(other) | Mover todos os filhos e entidades de other para este nó |