Darbas su scenos grafu
Darbas su scenos grafu
Kiekviena 3D scena Aspose.3D, skirta Java, organizuota kaip medžio struktūra Node objektų. Scene pateikia vieną šaknį — getRootNode() — ir kiekvienas geometrijos, medžiagos ir transformacijos elementas gyvena po ta šaknimi kaip vaiko arba palikuonio mazgas.
Scenos kūrimas ir prieiga prie šaknies mazgo
Scene automatiškai inicijuojamas su šakniniu mazgu, pavadintu "RootNode":
import com.aspose.threed.Scene;
import com.aspose.threed.Node;
Scene scene = new Scene();
Node root = scene.getRootNode(); // always "RootNode"Vaikų mazgų pridėjimas
Iškvieskite createChildNode() bet kuriame mazge, kad pridėtumėte vaiką. Šis metodas turi tris dažniausiai naudojamus perkrovimus:
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);Norėdami prijungti mazgą, sukurtą atskirai, naudokite addChildNode():
Node detached = new Node("standalone");
root.addChildNode(detached);Vaikų mazgų užklausos
Raskite tiesioginį vaiką pagal pavadinimą arba indeksą, arba iteruokite per visus tiesioginius vaikus:
// 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) ieško tik tiesioginių vaikų, o ne viso poantrankio. Naudokite accept() ieškoti viso medžio.
Viso medžio naršymas
node.accept(NodeVisitor) eina per mazgą ir visus jo palikuonius gylio pirmumo tvarka. Lankytojas grąžina true kad tęstų arba false kad anksti sustotų:
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 yra vieno metodo sąsaja, todėl priima lambda išraišką Java 8+.
Matomumo ir eksporto išskyrimo valdymas
Mazgo gali būti paslėpti arba išskirti iš eksporto nepašalinus jų iš hierarchijos:
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) yra rodymo patarimas. setExcluded(true) neleidžia mazgui pasirodyti eksportuojamuose failuose, nepriklausomai nuo formato.
Daugelio objektų (entity) priskyrimas vienam mazgui
Mazgas turi pirminį entity (getEntity() / setEntity()), bet gali talpinti papildomus objektus per addEntity(). Tai naudinga, kai skirtingi mesh gabalai dalijasi vienu transformavimu:
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());
}Mazgų sujungimas
merge() perkelia visus vaikus, objektus ir medžiagas iš šaltinio mazgo į tikslinį mazgą. Šaltinio mazgas lieka tuščias:
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 emptyKiti žingsniai
- Transformacijų taikymas — pozicionuoti, sukti ir mastuoti bet kurį mazgą naudojant jo
Transform - Tinklo kūrimas ir darbas su Mesh — sukurti daugiakampės geometrijos modelį ir prijungti jį prie mazgų
API greita nuoroda
| Narys | Aprašymas |
|---|---|
scene.getRootNode() | Scenos medžio šaknis; visada yra po new Scene() |
node.createChildNode(name) | Sukurti pavadintą vaikų mazgą be objekto |
node.createChildNode(name, entity) | Sukurti pavadintą vaikų mazgą su objektu |
node.createChildNode(name, entity, material) | Sukurti pavadintą vaikų mazgą su objektu ir medžiaga |
node.addChildNode(node) | Prijungti atskirai sukurtą Node |
node.getChild(name) | Rasti tiesioginį vaiką pagal pavadinimą; grąžina null jei nerasta |
node.getChild(index) | Gauti tiesioginį vaiką nurodytame indekse |
node.getChildNodes() | List<Node> visų tiesioginių vaikų |
node.accept(visitor) | Eiti per šį mazgą ir visus jo palikuonis gylio pirmumo tvarka |
node.addEntity(entity) | Prisegti papildomą objektą prie mazgo |
node.getEntities() | List<Entity> visų objektų šiame mazge |
node.setVisible(bool) | Rodyti arba slėpti mazgą |
node.setExcluded(bool) | Įtraukti arba pašalinti mazgą iš eksporto |
node.merge(other) | Perkelti visus vaikus ir objektus iš other į šį mazgą |