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 operationsVisible = 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 emptySljedeći koraci
- Primjena transformacija — pomak, rotaciju i skaliranje bilo kojeg čvora pomoću njegovog
Transform - Stvaranje primitivne geometrije — upotrijebite
Box,Sphere, iCylinderkao entitete scene - Stvaranje i rad s mrežama — izgradite poligonalnu geometriju i pričvrstite je na čvorove
Kratki pregled API-ja
| Član | Opis |
|---|---|
scene.RootNode | Korijen 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.ChildNodes | IList<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.Entities | IList<Entity> od svih entiteta na ovom čvoru |
node.Visible | Prikaži ili sakrij čvor |
node.Excluded | Uključ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 |