Arbeta med scengrafen

Arbeta med scengrafen

Varje 3D-scen i Aspose.3D för Java är organiserad som ett träd av Node objekt. Scene tillhandahåller en enda rot — getRootNode() — och varje geometridel, material och transform lever under den roten som ett barn- eller ättlingnod.


Skapa scenen och komma åt rot‑noden

Scene initierar automatiskt med en rotnod med namnet "RootNode":

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

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

Lägga till barnnoder

Anropa createChildNode() på vilken nod som helst för att lägga till ett barn. Metoden har tre vanligt använda överlagringar:

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 konstruerats separat, använd addChildNode():

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

Fråga barnnoder

Hitta ett direkt barn efter namn eller efter 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öker endast direkta barn, inte hela underträdet. Använd accept() för att söka i hela trädet.


Traversera hela trädet

node.accept(NodeVisitor) går igenom en nod och alla dess ättlingar i djupförstordning. Besökaren returnerar true för att fortsätta eller false för att stoppa 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 ett gränssnitt med en enda metod, så det accepterar en lambda i Java 8+.


Styrning av synlighet och exportundantag

Noder kan döljas eller uteslutas från export utan att tas bort från hierarkin:

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


Koppla flera enheter till en nod

En nod har en primär entity (getEntity() / setEntity()), men kan hålla ytterligare entiteter genom addEntity(). Detta är användbart när olika mesh‑delar delar en enda transform:

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

Sammanfoga noder

merge() flyttar alla barn, entiteter och material från en källnod till mål‑noden. Källnoden blir 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

Nästa steg


API‑snabbreferens

MedlemBeskrivning
scene.getRootNode()Roten i scenträdet; alltid närvarande efter new Scene()
node.createChildNode(name)Skapa en namngiven barnnod utan entitet
node.createChildNode(name, entity)Skapa en namngiven barnnod med en entitet
node.createChildNode(name, entity, material)Skapa en namngiven barnnod med entitet och material
node.addChildNode(node)Fäst en separat konstruerad Node
node.getChild(name)Hitta ett direkt barn efter namn; returnerar null om inte hittas
node.getChild(index)Hämta det direkta barnet på ett givet index
node.getChildNodes()List<Node> av alla direkta barn
node.accept(visitor)Gå igenom den här noden och alla dess undernoder i djupet först
node.addEntity(entity)Bifoga en ytterligare entitet till noden
node.getEntities()List<Entity> av alla entiteter på den här noden
node.setVisible(bool)Visa eller dölj noden
node.setExcluded(bool)Inkludera eller exkludera noden från export
node.merge(other)Flytta alla barn och entiteter från other till den här noden
 Svenska