Bekerja dengan Grafik Adegan
Bekerja dengan Grafik Adegan
Setiap adegan 3D di Aspose.3D untuk .NET diatur sebagai pohon dari Node objek. Scene.RootNode adalah akar dari pohon itu dan setiap potongan geometri, material, dan transform hidup di bawahnya sebagai anak atau keturunan.
Membuat Scene dan Mengakses Node Akar
Scene diinisialisasi secara otomatis dengan node akar bernama "RootNode":
using Aspose.ThreeD;
var scene = new Scene();
Node root = scene.RootNode; // always "RootNode"Menambahkan Node Anak
Panggil CreateChildNode() pada node mana pun untuk menambahkan anak. Metode ini memiliki tiga overload yang umum digunakan:
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);Untuk melampirkan node yang dibangun secara terpisah, gunakan AddChildNode():
var detached = new Node("standalone");
root.AddChildNode(detached);Menanyakan Node Anak
Temukan anak langsung berdasarkan nama atau indeks, atau iterasi semua anak langsung:
// 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) hanya mencari anak langsung, bukan seluruh subtree. Gunakan pembantu rekursif atau Accept() untuk mencari seluruh pohon.
Menelusuri Seluruh Pohon
Untuk penelusuran depth-first penuh, iterasikan ChildNodes secara rekursif:
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);Untuk penelusuran dengan keluar awal, node.Accept(NodeVisitor) tersedia dan memanggil visitor pada setiap keturunan sampai visitor mengembalikan false.
Menggunakan Group untuk Mengatur Objek Terkait
Group adalah entitas kontainer yang secara logis mengatur node tanpa menambahkan geometri. Lampirkan ke node yang anak‑anaknya mewakili unit logis:
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));Memindahkan roomNode mengubah semua perabot sekaligus karena anak‑anak mewarisi nya Transform.
Mengontrol Visibilitas dan Pengecualian Ekspor
Node dapat disembunyikan atau dikecualikan dari ekspor tanpa dihapus dari hierarki:
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 adalah petunjuk tampilan. Excluded = true mencegah node muncul dalam file yang diekspor terlepas dari format.
Melampirkan Beberapa Entitas ke Satu Node
Sebuah node memiliki utama entitas (Entity properti), tetapi dapat menampung entitas tambahan melalui AddEntity(). Ini berguna ketika potongan mesh yang berbeda berbagi satu transformasi:
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);Menggabungkan Node
Merge() memindahkan semua anak, entitas, dan material dari node sumber ke node target. Node sumber dibiarkan kosong:
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 emptyLangkah Selanjutnya
- Menerapkan Transformasi — posisi, rotasi, dan skala pada node apa pun menggunakan
Transform - Membuat Geometri Primitif — gunakan
Box,Sphere, danCylindersebagai entitas adegan - Membuat dan Bekerja dengan Mesh — membangun geometri poligon dan melampirkannya ke node
Referensi Cepat API
| Anggota | Deskripsi |
|---|---|
scene.RootNode | Akar dari pohon adegan; selalu ada setelah new Scene() |
node.CreateChildNode(name) | Buat node anak bernama tanpa entitas |
node.CreateChildNode(name, entity) | Buat node anak bernama dengan entitas |
node.CreateChildNode(name, entity, material) | Buat node anak bernama dengan entitas dan material |
node.AddChildNode(node) | Lampirkan yang dibangun secara terpisah Node |
node.GetChild(name) | Temukan anak langsung berdasarkan nama; mengembalikan null jika tidak ditemukan |
node.GetChild(index) | Dapatkan anak langsung pada indeks tertentu |
node.ChildNodes | IList<Node> dari semua anak langsung |
node.Accept(visitor) | Jelajahi node ini dan semua keturunan secara depth-first |
node.AddEntity(entity) | Lampirkan entitas tambahan ke node |
node.Entities | IList<Entity> dari semua entitas pada node ini |
node.Visible | Tampilkan atau sembunyikan node |
node.Excluded | Sertakan atau kecualikan node dari ekspor |
node.Merge(other) | Pindahkan semua anak dan entitas dari other ke dalam node ini |
new Group(name) | Entitas kontainer untuk mengelompokkan secara logis node anak |