Rad sa grafom scene

Rad sa grafom scene

Svaka 3D scena u Aspose.3D za .NET organizovana je kao stablo od Node objekata. Scene.RootNode je koren tog stabla i svaki deo geometrije, materijala i transformacije živi pod njim kao dete ili potomak.


Kreiranje scene i pristup korenskom čvoru

Scene inicijalizuje se automatski sa korenskim čvorom pod imenom "RootNode":

using Aspose.ThreeD;

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

Dodavanje čvorova-dece

Call CreateChildNode() na bilo kom čvoru da doda dete. Metoda ima tri najčešće korišćena preopterećenja:

using Aspose.ThreeD;
using Aspose.ThreeD.Entities;

var scene = new Scene();
Node root = scene.RootNode;

// 1. Named node with no entity — useful as a pivot or transform container
Node pivot = root.CreateChildNode("pivot");

// 2. Named node with an entity
var box = new Box(2, 2, 2);
Node boxNode = root.CreateChildNode("box", box);

// 3. Named node with entity and material
var mat = new Aspose.ThreeD.Shading.PhongMaterial("red");
mat.Diffuse = new Vector4(0.8, 0.2, 0.2, 1.0);
Node decorated = pivot.CreateChildNode("red_box", box, mat);

Da biste prikačili čvor konstruisan odvojeno, koristite AddChildNode():

var detached = new Node("standalone");
root.AddChildNode(detached);

Pretraživanje čvorova-dece

Pronađite direktno dete po imenu ili po indeksu, ili iterirajte sva direktna deca:

// By name — returns null if no direct child has that name
Node? found = root.GetChild("box");
if (found != null)
    Console.WriteLine("Found: " + found.Name);

// By index
Node first = root.GetChild(0);

// Iterate all direct children
foreach (Node child in root.ChildNodes)
    Console.WriteLine(child.Name);

GetChild(string name) pretražuje samo direktna deca, ne ceo podstablo. Koristite rekurzivni pomoćnik ili Accept() za pretragu celog stabla.


Prolazak kroz celo stablo

Za potpuno dubinsko obilazak, iterirajte ChildNodes rekurzivno:

static void Walk(Node node, int depth = 0)
{
    Console.WriteLine(new string(' ', depth * 2) + node.Name);
    foreach (var child in node.ChildNodes)
        Walk(child, depth + 1);
}

Walk(scene.RootNode);

Za ranu izlaznu traversalu, node.Accept(NodeVisitor) je dostupna i poziva visitor na svakom potomku dok visitor ne vrati false.


Korišćenje Group za organizovanje povezanih objekata

Group je entitet kontejner koji logički organizuje čvorove bez dodavanja geometrije. Prikačite ga na čvor čija deca predstavljaju logičku jedinicu:

using Aspose.ThreeD;
using Aspose.ThreeD.Entities;

var scene = new Scene();

// A group node for all furniture in a room
var furnitureGroup = new Group("furniture");
Node roomNode = scene.RootNode.CreateChildNode("living_room", furnitureGroup);

// Child nodes under the group node
Node sofaNode  = roomNode.CreateChildNode("sofa",         new Box(3, 1, 1));
Node tableNode = roomNode.CreateChildNode("coffee_table", new Box(2, 0.5, 1));

Premještanje roomNode transformiše sav nameštaj zajedno jer deca nasleđuju njegov Transform.


Kontrola vidljivosti i isključivanja iz izvoza

Čvorovi mogu biti sakriveni ili isključeni iz izvoza bez da se uklone iz hijerarhije:

Node ground = scene.RootNode.CreateChildNode("ground_plane", new Box(100, 0.1, 100));
ground.Visible = false;       // hidden in viewport / renderer

Node helperNode = scene.RootNode.CreateChildNode("debug_arrow", new Box());
helperNode.Excluded = true;   // omitted from all export operations

Visible = false je prikazni nagoveštaj. Excluded = true sprečava da se čvor pojavi u izvezenim fajlovima bez obzira na format.


Priključivanje više entiteta na jedan čvor

Čvor ima primarni entitet (Entity svojstvo), ali može da sadrži dodatne entitete kroz AddEntity(). Ovo je korisno kada različiti delovi mreže dele jedan transform:

var bodyMesh  = new Mesh("body");
var wheelMesh = new Mesh("wheel");

Node carNode = scene.RootNode.CreateChildNode("car");
carNode.AddEntity(bodyMesh);
carNode.AddEntity(wheelMesh);

// Retrieve all entities on this node
foreach (Entity ent in carNode.Entities)
    Console.WriteLine(ent.GetType().Name + ": " + ent.Name);

Spajanje čvorova

Merge() premesta svu decu, entitete i materijale sa izvornog čvora u ciljni čvor. Izvorni čvor ostaje prazan:

Node lod0 = scene.RootNode.CreateChildNode("lod0");
lod0.CreateChildNode("mesh_high", new Box(1, 1, 1));

Node lod1 = scene.RootNode.CreateChildNode("lod1");
lod1.CreateChildNode("mesh_low", new Box(1, 1, 1));

// Consolidate lod0 children into lod1
lod1.Merge(lod0);
// lod1 now has both mesh_high and mesh_low; lod0 is empty

Sledeći koraci


Kratki pregled API‑ja

ČlanOpis
scene.RootNodeKoren stabla scene; uvek prisutan nakon new Scene()
node.CreateChildNode(name)Kreirajte imenovani podčvor bez entiteta
node.CreateChildNode(name, entity)Kreirajte imenovani podčvor sa entitetom
node.CreateChildNode(name, entity, material)Kreirajte imenovani podčvor sa entitetom i materijalom
node.AddChildNode(node)Prikači zasebno konstruisano Node
node.GetChild(name)Pronađi direktno dete po imenu; vraća null ako nije pronađeno
node.GetChild(index)Preuzmi direktno dete na datom indeksu
node.ChildNodesIList<Node> od svih direktnih dece
node.Accept(visitor)Prođi kroz ovaj čvor i sve potomke po dubinskom pretraživanju
node.AddEntity(entity)Prikači dodatni entitet na čvor
node.EntitiesIList<Entity> od svih entiteta na ovom čvoru
node.VisiblePrikaži ili sakrij čvor
node.ExcludedUključi ili isključi čvor iz izvoza
node.Merge(other)Premesti sve podređene i entitete iz other u ovaj čvor
new Group(name)Entitet kontejner za logičko grupisanje podređenih čvorova
 Српски