کار با گراف صحنه

کار با گراف صحنه

هر صحنهٔ 3D در Aspose.3D برای .NET به صورت درختی از Node اشیاء. Scene.RootNode ریشهٔ آن درخت است و هر قطعهٔ هندسه، ماده و تبدیل زیر آن به عنوان فرزند یا نوادگان قرار می‌گیرد.


ایجاد صحنه و دسترسی به گرهٔ ریشه

Scene به‌صورت خودکار با یک گره ریشه به نام "RootNode":

using Aspose.ThreeD;

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

افزودن گره‌های فرزند

Call CreateChildNode() روی هر گره برای افزودن یک فرزند فراخوانی می‌شود. این متد سه overload رایج دارد:

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(). این زمانی مفید است که قطعات مش مختلف یک تبدیل واحد را به اشتراک بگذارند:

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)موجودیت ظرف برای گروه‌بندی منطقی گره‌های فرزند
 فارسی