Scene Graph ile çalışmak
Scene Graph ile çalışmak
Java için Aspose.3D’deki her 3D sahne bir ağaç olarak düzenlenir. Node nesneler için. Scene tek bir kök oluşturur - getRootNode() - ve her geometri, malzeme ve bu kökün altında bir çocuk ya da soyundan düğüm olarak yaşamı dönüştürmek.
Sahne oluşturmak ve kök düğmesine erişmek
Scene otomatik olarak bir kök düğmesi ile başlatılır. "RootNode":
import com.aspose.threed.Scene;
import com.aspose.threed.Node;
Scene scene = new Scene();
Node root = scene.getRootNode(); // always "RootNode"Çocuk Node eklemek
Çağrı createChildNode() Bir çocuğu eklemek için herhangi bir düğme üzerinde. yöntem üç yaygın olarak kullanılan aşırı yükleme vardır:
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);ayrı bir şekilde yapılandırılmış bir düğme bağlamak için, kullanın addChildNode():
Node detached = new Node("standalone");
root.addChildNode(detached);Çocuk Node İstiyor
Doğrudan bir çocuğu ad veya indekse göre bul, ya da tüm doğrudan çocukları iterate edin:
// 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)sadece arama Doğrudan Çocuklar,Tam bir alt ağacı değil. not thataccept()Sadece “node” olarak adlandırılan bir nokta ziyaret eder; iterategetChildNodes()Tüm ağaçları aramak için tekrar.
Tam ağaçtan geçmek
node.accept(NodeVisitor) Sadece çağrılan düğmeyi ziyaret eder - çocuklara geri dönmez. tam ağaçtan geçmek için, iterate getChildNodes() Giriş: Ziyaretçi geri dönüyor true devam etmek ya da false Erken durmak için:
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 tek yönlü bir arayüz, bu yüzden Java 8+‘da bir lambda kabul eder.
Görünürlük ve ihracat dışlanma kontrolü
Node, ihracatın gizlenmesi veya dışlanması olmadan ierarşiden çıkarılabilir:
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) Bu bir gösteri hintidir. setExcluded(true) node, formatına bakılmaksızın ihraç edilen dosyalarda görünmesini engeller.
Birden fazla entiteyi tek bir düğmeye bağlamak
Bir node bir Temel Birim (getEntity() / setEntity()(Ayrıca, daha fazla kuruluş tarafından kullanılabilir) addEntity().Bu, farklı mesh parçaları tek bir dönüşüm paylaştığında yararlıdır:
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());
}Node Çıkarma
merge() Tüm çocukları, varlıkları ve malzemeleri bir kaynak düğmesinden hedef düzeye aktarır. kaynak node boş bırakılır:
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 Hızlı Referans
| Üye | Açıklama |
|---|---|
scene.getRootNode() | Ağaçların kökü; her zaman mevcut sonra new Scene() |
node.createChildNode(name) | Bir varlık olmayan bir çocuk düğmesi oluşturun |
node.createChildNode(name, entity) | Bir entite ile adlandırılan bir çocuk düğmesi oluşturun |
node.createChildNode(name, entity, material) | Bir varlık ve malzeme ile adlandırılan bir çocuk düğmesi oluşturun |
node.addChildNode(node) | ayrı inşa edilmiş bir yapıya sahiptir. Node |
node.getChild(name) | Doğrudan bir çocuğu ismi ile bul; geri dönüşler null bulamadıkça |
node.getChild(index) | Doğrudan çocuğu belirli bir endeksle alın |
node.getChildNodes() | List<Node> Tüm Doğrudan Çocuklar |
node.accept(visitor) | Sadece bu düğmeyi ziyaret edin (çocuklara geri dönmeyin) |
node.addEntity(entity) | Bir düğmeye ek bir entite ekleme |
node.getEntities() | List<Entity> Tüm bu düğümdeki kuruluşlar |
node.setVisible(bool) | Göster veya gizle düğme |
node.setExcluded(bool) | -Kapalı veya dışlanabilir düğmeyi ihraç etmek |
node.merge(other) | Tüm çocukları ve kuruluşları hareket ettirmek için other Bu düğümde |