A jelenetgrafikon kezelése

A jelenetgrafikon kezelése

A jelenetgrafikon kezelése

Minden 3D jelenet a Aspose.3D-ben a .NET számára egy fa struktúrában van szervezve Node objektumok. Scene.RootNode a fa gyökere, és minden geometriai elem, anyag és transzformáció gyermekként vagy leszármazottként él alatta.


A jelenet létrehozása és a gyökércsomópont elérése

Scene automatikusan inicializálódik egy root node névvel "RootNode":

using Aspose.ThreeD;

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

Gyermekcsomópontok hozzáadása

Call CreateChildNode() bármely node-on egy gyermek hozzáadásához. A metódusnak három gyakran használt overloadja van:

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

Egy külön felépített node csatolásához használd AddChildNode():

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

Gyermekcsomópontok lekérdezése

Keress közvetlen gyermeket név vagy index alapján, vagy iterálj végig az összes közvetlen gyermeken:

// 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) csak keres közvetlen gyermekeket, nem a teljes alfa struktúrát. Használj rekurzív segédfüggvényt vagy Accept() az egész fa kereséséhez.


A teljes fa bejárása

Teljes mélységi bejáráshoz iterálj ChildNodes rekurzívan:

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

Korai kilépést lehetővé tevő bejáráshoz, node.Accept(NodeVisitor) elérhető, és a visitor-t minden leszármazottra meghívja, amíg a visitor visszatér false.


A Group használata kapcsolódó objektumok szervezésére

Group egy container entity, amely logikailag szervezi a node-okat anélkül, hogy geometriát adna hozzá. Csatold egy olyan node-hoz, amelynek gyermekei logikai egységet képviselnek:

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

Áthelyezés roomNode átalakítja az összes bútort együtt, mert a gyermekek öröklik azt Transform.


A láthatóság és az export kizárásának vezérlése

A csomópontok elrejthetők vagy kizárhatók az exportálásból anélkül, hogy eltávolítanák őket a hierarchiából:

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 egy megjelenítési tipp. Excluded = true megakadályozza, hogy a csomópont megjelenjen az exportált fájlokban a formátumtól függetlenül.


Több entitás csatolása egy csomóponthoz

Egy csomópont rendelkezik egy elsődleges entitással (Entity tulajdonsággal), de további entitásokat is tartalmazhat a AddEntity(). Ez akkor hasznos, amikor különböző hálóelemek egyetlen transzformációt osztanak meg:

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

Csomópontok egyesítése

Merge() áthelyezi az összes gyermeket, entitást és anyagot egy forrás csomópontból a cél csomópontba. A forrás csomópont üres marad:

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

Következő lépések


API gyorsreferencia

TagLeírás
scene.RootNodeA jelenetfa gyökere; mindig jelen van ezután new Scene()
node.CreateChildNode(name)Nevesített gyermekcsomópont létrehozása entitás nélkül
node.CreateChildNode(name, entity)Nevesített gyermekcsomópont létrehozása entitással
node.CreateChildNode(name, entity, material)Nevesített gyermekcsomópont létrehozása entitással és anyaggal
node.AddChildNode(node)Csatoljon egy külön felépített Node
node.GetChild(name)Keresse meg a közvetlen gyermeket név alapján; visszaadja null ha nem található
node.GetChild(index)Szerezze meg a megadott indexű közvetlen gyermeket
node.ChildNodesIList<Node> az összes közvetlen gyermek közül
node.Accept(visitor)Bejárja ezt a csomópontot és az összes leszármazottját mélységi előrendben
node.AddEntity(entity)Csatoljon egy további entitást a csomóponthoz
node.EntitiesIList<Entity> az ezen a csomóponton lévő összes entitás közül
node.VisibleA csomópont megjelenítése vagy elrejtése
node.ExcludedA csomópont belefoglalása vagy kizárása az exportból
node.Merge(other)Mozgassa át az összes gyermeket és entitást a other ebbe a csomópontba
new Group(name)Konténer entitás a gyermekcsomópontok logikai csoportosításához
 Magyar