การทำงานกับกราฟฉาก
การทำงานกับกราฟฉาก
ทุกฉาก 3D ใน Aspose.3D สำหรับ .NET ถูกจัดระเบียบเป็นต้นไม้ของ Node วัตถุ. Scene.RootNode เป็นรากของต้นไม้นั้นและทุกชิ้นส่วนของเรขาคณิต, วัสดุ, และการแปลง จะอยู่ภายใต้เป็นลูกหรือทายาท.
การสร้างฉากและการเข้าถึงโหนดราก
Scene จะเริ่มต้นโดยอัตโนมัติด้วยโหนดรากที่ชื่อว่า "RootNode":
using Aspose.ThreeD;
var scene = new Scene();
Node root = scene.RootNode; // always "RootNode"การเพิ่มโหนดลูก
เรียก 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 property), แต่สามารถเก็บเอนทิตี้เพิ่มเติมผ่าน 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ขั้นตอนต่อไป
- การใช้การแปลง — ตำแหน่ง, หมุน, และสเกลโหนดใด ๆ ด้วย its
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) | เอนทิตีคอนเทนเนอร์สำหรับจัดกลุ่มโหนดลูกอย่างมีตรรกะ |