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 operationsVisible = 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 emptyCác bước tiếp theo
- Áp dụng Biến đổi — vị trí, quay và tỷ lệ bất kỳ nút nào bằng cách sử dụng
Transform - Tạo Hình học Nguyên thủy — sử dụng
Box,Sphere, vàCylinderlà các thực thể trong cảnh - Tạo và Làm việc với Lưới — xây dựng hình đa giác và gắn nó vào các nút
Tham chiếu nhanh API
| Thành viên | Mô tả |
|---|---|
scene.RootNode | Gố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.ChildNodes | IList<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.Entities | IList<Entity> của tất cả các thực thể trên nút này |
node.Visible | Hiển thị hoặc ẩn nút |
node.Excluded | Bao 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 |