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 bahwaaccept()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 operationssetVisible(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 emptyAPI Referensi Cepat
| anggota | Penerangan |
|---|---|
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 |