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 that accept() Sadece “node” olarak adlandırılan bir nokta ziyaret eder; iterate getChildNodes() 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 operations

setVisible(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 empty


API Hızlı Referans

ÜyeAçı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
 Türkçe