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 operationsVisible = 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 emptyKövetkező lépések
- Transzformációk alkalmazása — pozicionálás, forgatás és méretezés bármely csomópontnál a saját
Transform - Alapvető geometria létrehozása — használja
Box,Sphere, ésCylindermint jelenet entitásokat - Hálók létrehozása és kezelése — polygon geometria építése és csomópontokhoz csatolása
API gyorsreferencia
| Tag | Leírás |
|---|---|
scene.RootNode | A 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.ChildNodes | IList<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.Entities | IList<Entity> az ezen a csomóponton lévő összes entitás közül |
node.Visible | A csomópont megjelenítése vagy elrejtése |
node.Excluded | A 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 |