العمل مع مخطط المشهد
العمل مع مخطط المشهد
كل مشهد ثلاثي الأبعاد في 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() للبحث في الشجرة بأكملها.
تصفح الشجرة بالكامل
لإجراء مسار كامل بنظام depth-first، كرّر 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) متاح ويستدعي الـvisitor على كل سليل حتى يُعيد الـvisitor 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(). هذا مفيد عندما تشترك قطع الشبكة المختلفة في تحويل واحد:
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ككيانات المشهد - إنشاء والعمل مع الشبكات — بناء هندسة مضلع وإرفاقها بالعقد
مرجع سريع لواجهة برمجة التطبيقات (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) | كيان الحاوية لتجميع العقد الفرعية منطقياً |