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 attaccept()besöker endast den så kallade knuten; iterategetChildNodes()å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 operationssetVisible(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 emptyAPI snabb referens
| Medlemmar | Beskrivning |
|---|---|
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 |