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 operationssetVisible(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 emptyNästa steg
- Applicera transformationer — positionera, rotera och skala vilken nod som helst med dess
Transform - Skapa och arbeta med mesh — bygg polygongeometri och fäst den på noder
API‑snabbreferens
| Medlem | Beskrivning |
|---|---|
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 |