Bekerja dengan Grafik Adegan

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 operations

Visible = 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 empty

Langkah Selanjutnya


Referensi Cepat API

AnggotaDeskripsi
scene.RootNodeAkar 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.ChildNodesIList<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.EntitiesIList<Entity> dari semua entitas pada node ini
node.VisibleTampilkan atau sembunyikan node
node.ExcludedSertakan 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
 Bahasa Indonesia