Berkerjasama dengan Scene Graph

Berkerjasama dengan Scene Graph

Berkerjasama dengan Scene Graph

Setiap adegan 3D di Aspose.3D untuk Java disusun sebagai pohon dari Node objek yang. Scene Satu akar yang satu-satu - getRootNode() dan setiap kepingan geometri, materi, dan mengubah kehidupan di bawah akar itu sebagai anak atau node keturunan.


Mencipta adegan dan mengakses node akar

Scene Inicialisasi secara otomatis dengan node akar yang disebut "RootNode":

import com.aspose.threed.Scene;
import com.aspose.threed.Node;

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

Menambahkan Node Anak

panggilan createChildNode() pada setiap nod untuk menambahkan anak. metode ini memiliki tiga overload yang biasa digunakan:

import com.aspose.threed.*;

Scene scene = new Scene();
Node root = scene.getRootNode();

// 1. Named node with no entity — useful as a pivot or group container
Node pivot = root.createChildNode("pivot");

// 2. Named node with an entity
Mesh mesh = new Mesh("box");
mesh.getControlPoints().add(new Vector4(0, 0, 0));
mesh.getControlPoints().add(new Vector4(1, 0, 0));
mesh.getControlPoints().add(new Vector4(1, 1, 0));
mesh.getControlPoints().add(new Vector4(0, 1, 0));
mesh.createPolygon(0, 1, 2, 3);
Node meshNode = root.createChildNode("box", mesh);

// 3. Named node with entity and material
PbrMaterial mat = new PbrMaterial("red");
mat.setAlbedo(new Vector4(0.8f, 0.2f, 0.2f, 1.0f));
Node decorated = pivot.createChildNode("red_box", mesh, mat);

Untuk melampirkan nod yang dibangun secara terpisah, gunakan addChildNode():

Node detached = new Node("standalone");
root.addChildNode(detached);

Mencari Node Anak

Temukan anak langsung dengan nama atau indeks, atau iterate semua anak yang langsung:

// By name — returns null if no direct child has that name
Node found = root.getChild("box");
if (found != null) {
    System.out.println("Found: " + found.getName());
}

// By index
Node first = root.getChild(0);

// Iterate all direct children
for (Node child : root.getChildNodes()) {
    System.out.println(child.getName());
}

getChild(String name) Hanya mencari Anak-anak langsung,Bukan di bawah tanah.Tidak ada yang mengatakan bahwa accept() Hanya ada yang menyebutkan node; iterate. getChildNodes() Berulang kali mencari seluruh pohon.


Mengembara di seluruh pohon

node.accept(NodeVisitor) hanya mengunjungi yang disebut nod - ia tidak berbalik ke anak-anak. untuk melewati pohon penuh, iterate getChildNodes() Kembali ke: pengunjung kembali true untuk melanjutkan atau false Untuk berhenti lebih awal:

import com.aspose.threed.NodeVisitor;

// Print every node name in the scene
scene.getRootNode().accept(n -> {
    System.out.println(n.getName());
    return true; // false would stop traversal
});

// Stop after finding the first node that has an entity
final Node[] found = {null};
scene.getRootNode().accept(n -> {
    if (n.getEntity() != null) {
        found[0] = n;
        return false; // stop walking
    }
    return true;
});

NodeVisitor adalah satu-metode interface, jadi ia menerima lambda dalam Java 8+.


Pemeriksaan visibilitas dan pengecualian ekspor

Node dapat disembunyikan atau dikecualikan dari ekspor tanpa dihapus dari hierarki:

Node ground = root.createChildNode("ground_plane", mesh);
ground.setVisible(false);       // hidden in viewport / renderer

Node helperNode = root.createChildNode("debug_arrow", mesh);
helperNode.setExcluded(true);   // omitted from all export operations

setVisible(false) Ini adalah petunjuk ekspresi. setExcluded(true) mencegah nod dari muncul dalam file yang diekspor, terlepas dari format.


Menerapkan beberapa entitas ke satu nod

Node memiliki satu primary yang Organisasi (getEntity() / setEntity()(b) dapat mengendalikan entitas tambahan melalui addEntity().Ini berguna ketika berbagai potongan-potongan mesh berbagi satu transformasi:

Mesh body  = new Mesh("body");
Mesh wheel = new Mesh("wheel");

Node carNode = root.createChildNode("car");
carNode.addEntity(body);
carNode.addEntity(wheel);

// Retrieve all entities on this node
for (Entity ent : carNode.getEntities()) {
    System.out.println(ent.getName());
}

Menggabungkan Node

merge() menggerakkan semua anak, entitas dan bahan dari node sumber ke dalam nodo sasaran.:

Node lod0 = root.createChildNode("lod0");
lod0.createChildNode("mesh_high", mesh);

Node lod1 = root.createChildNode("lod1");
lod1.createChildNode("mesh_low", mesh);

// Consolidate lod0 children into lod1
lod1.merge(lod0);
// lod1 now has both mesh_high and mesh_low; lod0 is empty


API Referensi Cepat

anggotaPenerangan
scene.getRootNode()Rumput yang berakar; selalu hadir setelah new Scene()
node.createChildNode(name)Mencipta nod anak yang disebut dengan tidak memiliki entitas
node.createChildNode(name, entity)Mencipta nod anak yang disebut dengan entitas
node.createChildNode(name, entity, material)Mencipta nod anak yang disebut dengan entitas dan bahan
node.addChildNode(node)Membangun sebuah bangunan yang terpisah Node
node.getChild(name)Temukan anak langsung dengan nama; kembali null Jika tidak ditemukan
node.getChild(index)Dapatkan anak langsung pada indeks tertentu
node.getChildNodes()List<Node> dari semua anak langsung
node.accept(visitor)Hanya kunjungi nod ini (tidak mengembalikan ke anak-anak)
node.addEntity(entity)Menambahkan entitas tambahan ke nod
node.getEntities()List<Entity> Semua entitas di nod ini
node.setVisible(bool)Tunjukkan atau sembunyikan nodus
node.setExcluded(bool)Menerima atau mengecualikan nod dari ekspor
node.merge(other)Mengalihkan semua anak dan entitas dari other Dalam nod ini
 Bahasa Indonesia