Arbeta med scenen grafen

Arbeta med scenen grafen

Arbeta med scenen grafen

Varje 3D-scena i Aspose.3D för Java är organiserad som ett träd av Node och föremål. Scene Det finns en enda rötter - getRootNode() - och varje bit av geometri, material och omvandling av liv under den rötten som ett barn eller en efterkommande nod.


Skapa scenen och få tillgång till rotonen

Scene initialiserar automatiskt med en root nod som heter "RootNode":

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

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

Lägga till barn noder

Ringa till createChildNode() på någon nod för att lägga till ett barn. Metoden har tre vanliga överbelastningar:

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

För att fästa en nod som byggdes separat, använd addChildNode():

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

Söker barn noder

Hitta ett direkt barn efter namn eller index, eller iterera alla direkta barn:

// 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) Sök bara Direkt barn,inte den fullständiga undergrunden. notera att accept() besöker endast den så kallade knuten; iterate getChildNodes() återvänder för att söka hela trädet.


Att gå över hela trädet

node.accept(NodeVisitor) besöker endast den så kallade knuten – det återvänder inte till barn. För att passera genom hela trädet, iterate getChildNodes() återvänder. besökaren kommer tillbaka true att fortsätta eller false För att sluta tidigt:

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 är en enkelmetod gränssnitt, så det accepterar ett lambda i Java 8+.


Kontroll av synlighet och exportutestängning

Noder kan gömmas eller uteslutas från export utan att tas bort från hierarki:

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) Det är en displayhint. setExcluded(true) förhindrar att knuten visas i exporterade filer oavsett format.


Anslut flera enheter till ett noder

En node har en primär Enheterna (getEntity() / setEntity()kan dock inneha ytterligare enheter genom att addEntity().Detta är användbart när olika mesh bitar delar en enda transformation:

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

Merging Nodes

merge() flyttar alla barn, enheter och material från ett källkört till målskirt.Källakretsen lämnas tom:

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 snabb referens

MedlemmarBeskrivning
scene.getRootNode()Rötterna av scenen träd; alltid närvarande efter new Scene()
node.createChildNode(name)Skapa en namngiven barnknut med ingen entitet
node.createChildNode(name, entity)Skapa en namngiven barnknut med en entitet
node.createChildNode(name, entity, material)Skapa en namngiven barnknut med entitet och material
node.addChildNode(node)En separat byggd Node
node.getChild(name)Hitta ett direkt barn efter namn; returnerar null Om inte hittas
node.getChild(index)Få barnet direkt till en given index
node.getChildNodes()List<Node> av alla direkt barn
node.accept(visitor)Besök endast denna nod (kan inte återvända till barn)
node.addEntity(entity)Anslut en extra entitet till knuten
node.getEntities()List<Entity> av alla enheter på denna node
node.setVisible(bool)Visa eller dölja knappen
node.setExcluded(bool)Inkludera eller utesluta knuten från exporten
node.merge(other)Flytta alla barn och enheter från other In i denna node
 Svenska