Darbas su scenos grafu

Darbas su scenos grafu

Kiekviena 3D scena Aspose.3D, skirta .NET, yra organizuota kaip medžio Node objektų. Scene.RootNode yra šio medžio šaknis, o kiekvienas geometrijos, medžiagos ir transformacijos elementas yra po juo kaip vaikas arba palikuonis.


Scenos kūrimas ir prieiga prie šaknies mazgo

Scene automatiškai inicijuojamas su šakniniu mazgu, pavadintu "RootNode":

using Aspose.ThreeD;

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

Vaikų mazgų pridėjimas

Call CreateChildNode() bet kuriame mazge, kad pridėtumėte vaiką. Šis metodas turi tris dažniausiai naudojamas perkrovas:

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);

Norėdami prijungti atskirai sukurtą mazgą, naudokite AddChildNode():

var 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)
    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) ieško tik tiesioginių vaikų, o ne viso poantrankio. Naudokite rekursinę pagalbinę funkciją arba Accept() kad ieškotumėte viso medžio.


Viso medžio naršymas

Norėdami atlikti pilną gylio pirmumo (depth‑first) perėjimą, iteruokite ChildNodes rekursyviai:

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);

Norint ankstyvai nutraukti perėjimą, node.Accept(NodeVisitor) yra prieinama ir kviečia lankytoją (visitor) kiekvienam palikuoniui, kol lankytojas grąžina false.


Naudojant Group susijusių objektų organizavimui

Group yra konteinerio objektas, kuris logiškai organizuoja mazgus nepridėdamas geometrijos. Prijunkite jį prie mazgo, kurio vaikai atspindi loginę vienetą:

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));

Perkėlimas roomNode transformuoja visus baldus kartu, nes vaikai paveldi jo Transform.


Matomumo ir eksporto išskyrimo valdymas

Mazgo gali būti paslėpti arba išskirti iš eksporto nepašalinus jų iš hierarchijos:

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 yra rodymo patarimas. Excluded = true neleidžia mazgo pasirodyti eksportuojamuose failuose, nepriklausomai nuo formato.


Daugelio objektų (entity) priskyrimas vienam mazgui

Mazgas turi pirminį objektą (Entity savybę), tačiau gali talpinti papildomus objektus per AddEntity(). Tai naudinga, kai skirtingi tinklelio gabalai dalijasi vienu transformavimu:

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);

Mazgų sujungimas

Merge() perkelia visus vaikus, objektus ir medžiagas iš šaltinio mazgo į tikslinį mazgą. Šaltinio mazgas lieka tuščias:

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

Kiti žingsniai


API greita nuoroda

NarysAprašymas
scene.RootNodeScenos 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)Prisegti atskirai sukurtą Node
node.GetChild(name)Rasti tiesioginį vaiką pagal pavadinimą; grąžina null jei nerasta
node.GetChild(index)Gauti tiesioginį vaiką pagal nurodytą indeksą
node.ChildNodesIList<Node> iš visų tiesioginių vaikų
node.Accept(visitor)Eiti per šį mazgą ir visus jo palikuonius gilumos pirmumo tvarka
node.AddEntity(entity)Prisegti papildomą objektą prie mazgo
node.EntitiesIList<Entity> iš visų objektų šiame mazge
node.VisibleRodyti arba slėpti mazgą
node.ExcludedĮtraukti arba išimti mazgą iš eksporto
node.Merge(other)Perkelti visus vaikus ir objektus iš other į šį mazgą
new Group(name)Konteinerinis objektas, skirtas logiškai grupuoti vaikų mazgus
 Lietuvių