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 operations

setVisible(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 empty

Kiti žingsniai


API greita nuoroda

NarysApraš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ą
 Lietuvių