עבודה עם גרף הסצנה
עבודה עם גרף הסצנה
כל סצנה תלת‑ממדית ב‑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 operationsVisible = 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הצעדים הבאים
- החלת טרנספורמים — מיקום, סיבוב וקנה מידה של כל צומת באמצעות
Transform - יצירת גיאומטריה פרימיטיבית — השתמש
Box,Sphere, וCylinderכישויות סצנה - יצירה ועבודה עם Meshes — בניית גיאומטריית פוליגון והצמדתה לצמתים
הפניה מהירה ל-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.ChildNodes | IList<Node> מתוך כל הצאצאים הישירים |
node.Accept(visitor) | הלך על צומת זה וכל הצאצאים שלו בסדר עומק‑ראשון |
node.AddEntity(entity) | הצמד ישות נוספת לצומת |
node.Entities | IList<Entity> מתוך כל הישויות על צומת זה |
node.Visible | הצג או הסתר את הצומת |
node.Excluded | כלול או הוצא את הצומת מהייצוא |
node.Merge(other) | העבר את כל הצאצאים והישויות מ other אל צומת זה |
new Group(name) | ישות מכולה לקיבוץ לוגי של צמתים צאצאים |