Rad s grafom scene

Rad s grafom scene

Svaka 3D scena u Aspose.3D za .NET organizirana je kao stablo od Node objekata. Scene.RootNode je korijen tog stabla i svaki dio geometrije, materijala i transformacije nalazi se pod njim kao dijete ili potomak.


Stvaranje scene i pristup korijenskom čvoru

Scene inicijalizira se automatski s korijenskim čvorom pod nazivom "RootNode":

using Aspose.ThreeD;

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

Dodavanje podčvorova

Pozovite CreateChildNode() na bilo kojem čvoru da biste dodali dijete. Metoda ima tri najčešće korištene 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);

Za pričvršćivanje čvora konstruiranog odvojeno, koristite AddChildNode():

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

Upit podčvorova

Pronađite izravnog podčvora po imenu ili po indeksu, ili iterirajte sve izravne podčvorove:

// 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 izravna djeca, a ne cijelo podstablo. Koristite rekurzivnu pomoćnu funkciju ili Accept() za pretraživanje cijelog stabla.


Prolazak kroz cijelo stablo

Za potpuno dubinsko prvo pretraživanje, 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 traversiranje s ranim izlaskom, node.Accept(NodeVisitor) je dostupno i poziva posjetitelja na svakom potomku sve dok posjetitelj ne vrati false.


Korištenje Group za organiziranje povezanih objekata

Group je entitet kontejner koji logički organizira čvorove bez dodavanja geometrije. Priložite ga čvoru čija djeca 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 transformira sav namještaj zajedno jer djeca nasljeđuju njegovu Transform.


Upravljanje vidljivošću i isključivanjem iz izvoza

Čvorove je moguće sakriti ili isključiti 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 savjet. Excluded = true sprječava da se čvor pojavi u izvezenim datotekama neovisno o formatu.


Priključivanje više entiteta na jedan čvor

Čvor ima primarni entitet (Entity svojstvo), ali može sadržavati dodatne entitete putem AddEntity(). Ovo je korisno kada različiti dijelovi mreže dijele jedinstvenu transformaciju:

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() premješta svu djecu, entitete i materijale iz 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

Sljedeći koraci


Kratki pregled API-ja

ČlanOpis
scene.RootNodeKorijen stabla scene; uvijek prisutan nakon new Scene()
node.CreateChildNode(name)Stvori imenovani podčvor bez entiteta
node.CreateChildNode(name, entity)Stvori imenovani podčvor s entitetom
node.CreateChildNode(name, entity, material)Stvori imenovani podčvor s entitetom i materijalom
node.AddChildNode(node)Priloži odvojeno konstruirano Node
node.GetChild(name)Pronađi izravni potomak po imenu; vraća null ako nije pronađen
node.GetChild(index)Dohvati izravni potomak na zadanom indeksu
node.ChildNodesIList<Node> od svih izravnih potomaka
node.Accept(visitor)Prođi ovaj čvor i sve potomke po dubinskom pretraživanju
node.AddEntity(entity)Priloži dodatni entitet čvoru
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)Premjesti sve potomke i entitete iz other u ovaj čvor
new Group(name)Entitet kontejner za logičko grupiranje podčvorova
 Hrvatski