Trabalhando com o Graph Scene

Trabalhando com o Graph Scene

Trabalhando com o Graph Scene

Cada cena 3D em Aspose.3D para Java é organizada como uma árvore de Node Objetos de . Scene Ele fornece uma única raiz - getRootNode() e cada pedaço de geometria, material e transformação das vidas sob essa raiz como um filho ou nodo descendente.


Criar a cena e acessar o nodo de raiz

Scene Inicializa automaticamente com um nodo de raiz chamado "RootNode":

import com.aspose.threed.Scene;
import com.aspose.threed.Node;

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

Adicionar Nodes para Crianças

Chamado createChildNode() O método tem três sobrecargas comuns:

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 ligar um nodo que foi construído separadamente, use addChildNode():

Node detached = new Node("standalone");
root.addChildNode(detached);

Querendo Nodes Infantil

Encontre uma criança direta por nome ou í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) Buscar apenas Crianças Diretas,Não é o substrato completo.Nota que accept() Visita apenas o chamado nodo; iterate getChildNodes() de volta para procurar toda a árvore.


Passando pela árvore cheia

node.accept(NodeVisitor) Visita apenas o chamado nodo – não recorre aos filhos.Para atravessar a árvore inteira, iterate getChildNodes() A visitação: o visitante retorna true Para continuar ou false Para parar cedo:

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 um método, então aceita um lambda em Java 8+.


Controle de visibilidade e exclusão de exportação

Os nódulos podem ser escondidos 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 operations

setVisible(false) É um indicador de exposição. setExcluded(true) Evite que o nodo apareça em arquivos exportados, independentemente do formato.


A ligação de múltiplas entidades a um nodo

Um nodo tem um Primeiro A entidade (getEntity() / setEntity()( ) mas pode manter outras entidades através de addEntity().Isso é útil quando diferentes peças de mesh 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());
}

Mergendo Nodes

merge() movimenta todos os filhos, entidades e materiais de um nodo-fonte para o nódulo-alvo.O node-foque é deixado 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 empty


API de referência rápida

MembroDescrição
scene.getRootNode()A raiz da árvore do palco; sempre presente após new Scene()
node.createChildNode(name)Crie um nodo infantil com nenhuma entidade
node.createChildNode(name, entity)Crie um nodo infantil chamado com uma entidade
node.createChildNode(name, entity, material)Crie um nodo infantil com entidade e material
node.addChildNode(node)Construindo uma estrutura separada Node
node.getChild(name)Encontre um filho direto por nome; retorno null Se não encontrado
node.getChild(index)Obtenha o filho direto em um determinado índice
node.getChildNodes()List<Node> de todas as crianças diretas
node.accept(visitor)Visite apenas este nodo (não recorre aos filhos)
node.addEntity(entity)Adicionar uma entidade adicional ao nodo
node.getEntities()List<Entity> Todas as entidades neste nodo
node.setVisible(bool)Mostrar ou esconder o nodo
node.setExcluded(bool)Incluir ou excluír o nodo da exportação
node.merge(other)Mover todas as crianças e entidades de other Para esse nodo
 Português