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 operationsVisible = 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 emptyKiti žingsniai
- Transformacijų taikymas — pozicionuoti, sukti ir keisti mastelį bet kuriam mazgui naudojant jo
Transform - Primityvios geometrijos kūrimas — naudoti
Box,Sphere, irCylinderkaip scenos objektai - Kūrimas ir darbas su Meshes — sukurti daugiakampio geometriją ir prijungti ją prie mazgų
API greita nuoroda
| Narys | Aprašymas |
|---|---|
scene.RootNode | 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) | 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.ChildNodes | IList<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.Entities | IList<Entity> iš visų objektų šiame mazge |
node.Visible | Rodyti 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 |