עבודה עם גרף הסצנה

עבודה עם גרף הסצנה

עבודה עם גרף הסצנה

כל סצנה תלת‑ממדית ב‑Aspose.3D עבור .NET מאורגנת כעץ של Node אובייקטים. Scene.RootNode הוא השורש של העץ הזה וכל חלק של גאומטריה, חומר והמרה נמצא מתחתיו כילד או צאצא.


יצירת הסצנה וגישה לצומת השורש

Scene מתחיל אוטומטית עם צומת שורש בשם "RootNode":

using Aspose.ThreeD;

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

הוספת צמתים ילדים

Call CreateChildNode() על כל צומת כדי להוסיף ילד. לשיטה שלושה עומסים נפוצים:

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

כדי לצרף צומת שנבנה בנפרד, השתמש ב‑ AddChildNode():

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

שאילתת צמתים ילדים

מצא צומת ילד ישיר לפי שם או לפי אינדקס, או עבור על כל הילדים הישירים:

// 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) מחפש רק ילדים ישירים, ולא את תת‑העץ המלא. השתמש בעוזר רקורסיבי או Accept() כדי לחפש את כל העץ.


ניווט בעץ המלא

לצורך הליכה מלאה בעומק‑קודם, חזור על ChildNodes בצורה רקורסיבית:

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

לצורך מסע עם יציאה מוקדמת, node.Accept(NodeVisitor) זמין וקורא למבקר על כל צאצא עד שהמבקר מחזיר false.


שימוש ב‑Group לארגון אובייקטים קשורים

Group הוא ישות מכולת שמארגנת צמתים לוגית מבלי להוסיף גאומטריה. צרף אותו לצומת שהילדים שלו מייצגים יחידה לוגית:

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

העברה roomNode משנה את כל הרהיטים יחד מכיוון שהילדים יורשים את זה Transform.


בקרת נראות והחרגת ייצוא

ניתנים להסתיר צמתים או להוציאם מהייצוא מבלי להסירם מההיררכיה:

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 זה רמז תצוגה. Excluded = true מונע מהצומת להופיע בקבצים מיוצאים ללא קשר לפורמט.


צירוף ישויות מרובות לצומת אחד

לצומת יש ראשי ישות (Entity מאפיין), אך יכול להכיל ישויות נוספות דרך AddEntity(). זה שימושי כאשר חלקי mesh שונים חולקים transform יחיד:

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

מיזוג צמתים

Merge() מעביר את כל הילדים, הישויות והחומרים מצומת מקור לצומת יעד. צומת המקור נשאר ריק:

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

הצעדים הבאים


הפניה מהירה ל-API

חברתיאור
scene.RootNodeשורש של עץ הסצנה; תמיד קיים אחרי new Scene()
node.CreateChildNode(name)צור צומת ילד בשם ללא ישות
node.CreateChildNode(name, entity)צור צומת ילד בשם עם ישות
node.CreateChildNode(name, entity, material)צור צומת ילד בשם עם ישות וחומר
node.AddChildNode(node)הצמד אלמנט שנבנה בנפרד Node
node.GetChild(name)מצא צאצא ישיר לפי שם; מחזיר null אם לא נמצא
node.GetChild(index)קבל את הצאצא הישיר באינדקס נתון
node.ChildNodesIList<Node> מתוך כל הצאצאים הישירים
node.Accept(visitor)הלך על צומת זה וכל הצאצאים שלו בסדר עומק‑ראשון
node.AddEntity(entity)הצמד ישות נוספת לצומת
node.EntitiesIList<Entity> מתוך כל הישויות על צומת זה
node.Visibleהצג או הסתר את הצומת
node.Excludedכלול או הוצא את הצומת מהייצוא
node.Merge(other)העבר את כל הצאצאים והישויות מ other אל צומת זה
new Group(name)ישות מכולה לקיבוץ לוגי של צמתים צאצאים
 עברית