Làm việc với Đồ thị Cảnh

Làm việc với Đồ thị Cảnh

Làm việc với Đồ thị Cảnh

Mỗi cảnh 3D trong Aspose.3D cho .NET được tổ chức dưới dạng một cây của Node đối tượng. Scene.RootNode là gốc của cây đó và mọi phần tử hình học, vật liệu và biến đổi đều nằm dưới nó như một nút con hoặc hậu duệ.


Tạo Scene và Truy cập Nút Gốc

Scene tự động khởi tạo với một nút gốc có tên "RootNode":

using Aspose.ThreeD;

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

Thêm các Nút Con

Call CreateChildNode() trên bất kỳ nút nào để thêm một nút con. Phương thức này có ba phiên bản nạp chồng thường được sử dụng:

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

Để gắn một nút được tạo riêng, sử dụng AddChildNode():

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

Truy vấn các Nút Con

Tìm một nút con trực tiếp theo tên hoặc theo chỉ mục, hoặc lặp qua tất cả các nút con trực tiếp:

// 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) chỉ tìm kiếm các nút con trực tiếp, không phải toàn bộ cây con. Sử dụng một hàm trợ giúp đệ quy hoặc Accept() để tìm kiếm toàn bộ cây.


Duyệt toàn bộ Cây

Đối với một lần duyệt sâu toàn bộ, lặp lại ChildNodes đệ quy:

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

Đối với việc duyệt có thể thoát sớm, node.Accept(NodeVisitor) có sẵn và gọi hàm visitor trên mỗi hậu duệ cho đến khi hàm visitor trả về false.


Sử dụng Group để Tổ chức Các Đối Tượng Liên Quan

Group là một thực thể chứa, tổ chức các nút một cách logic mà không thêm hình học. Gắn nó vào một nút mà các nút con của nó đại diện cho một đơn vị logic:

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

Di chuyển roomNode biến đổi toàn bộ nội thất cùng nhau vì các phần tử con kế thừa nó Transform.


Kiểm soát Khả năng Hiển thị và Loại trừ Khi Xuất

Các nút có thể được ẩn hoặc loại trừ khỏi việc xuất mà không bị xóa khỏi cây phân cấp:

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 là một gợi ý hiển thị. Excluded = true ngăn node xuất hiện trong các tệp đã xuất bất kể định dạng.


Gắn nhiều thực thể vào một nút

Một nút có một chính thực thể (Entity thuộc tính), nhưng có thể chứa các thực thể bổ sung thông qua AddEntity(). Điều này hữu ích khi các mảnh lưới khác nhau chia sẻ một phép biến đổi duy nhất:

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

Hợp nhất các nút

Merge() di chuyển tất cả các nút con, thực thể và vật liệu từ một nút nguồn vào nút đích. Nút nguồn sẽ bị để trống:

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

Các bước tiếp theo


Tham chiếu nhanh API

Thành viênMô tả
scene.RootNodeGốc của cây cảnh; luôn có mặt sau new Scene()
node.CreateChildNode(name)Tạo một nút con có tên không có thực thể
node.CreateChildNode(name, entity)Tạo một nút con có tên với một thực thể
node.CreateChildNode(name, entity, material)Tạo một nút con có tên với thực thể và vật liệu
node.AddChildNode(node)Đính kèm một đối tượng được xây dựng riêng Node
node.GetChild(name)Tìm một nút con trực tiếp theo tên; trả về null nếu không tìm thấy
node.GetChild(index)Lấy nút con trực tiếp tại chỉ mục cho trước
node.ChildNodesIList<Node> của tất cả các nút con trực tiếp
node.Accept(visitor)Duyệt nút này và tất cả các nút con theo chiều sâu
node.AddEntity(entity)Đính kèm một thực thể bổ sung vào nút
node.EntitiesIList<Entity> của tất cả các thực thể trên nút này
node.VisibleHiển thị hoặc ẩn nút
node.ExcludedBao gồm hoặc loại trừ nút khỏi việc xuất
node.Merge(other)Di chuyển tất cả các nút con và thực thể từ other vào nút này
new Group(name)Thực thể chứa để nhóm logic các nút con
 Tiếng Việt