Работа с графа на сцената
Работа с графа на сцената
Всяка 3D сцена в Aspose.3D за Java е организирана като дърво от Node обекти. Scene осигурява единствен корен — getRootNode() — и всяка част от геометрия, материал и трансформация живее под този корен като дъщерен или наследен възел.
Създаване на сцената и достъп до кореновия възел
Scene се инициализира автоматично с коренов възел, наречен "RootNode":
import com.aspose.threed.Scene;
import com.aspose.threed.Node;
Scene scene = new Scene();
Node root = scene.getRootNode(); // always "RootNode"Добавяне на дъщерни възли
Извикайте createChildNode() на всеки възел, за да добавите дете. Методът има три често използвани претоварвания:
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);За да прикрепите възел, който е създаден отделно, използвайте addChildNode():
Node detached = new Node("standalone");
root.addChildNode(detached);Заявяване на дъщерни възли
Намерете директен дъщерен възел по име или по индекс, или итерирайте всички директни дъщерни възли:
// 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) търси само директни деца, не пълното поддърво. Използвайте accept() за търсене на цялото дърво.
Обхождане на цялото дърво
node.accept(NodeVisitor) обхожда възел и всичките му наследници в ред на дълбочина (depth-first). Посетителят връща true за продължаване или false за спиране преди време:
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 е интерфейс с един метод, затова приема ламбда в Java 8+.
Контрол на видимостта и изключване от експорта
Възлите могат да бъдат скрити или изключени от експорта, без да бъдат премахнати от йерархията:
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) е подсказка за показване. setExcluded(true) пречи на възела да се появява в експортираните файлове, независимо от формата.
Прикачване на множество ентитети към един възел
Възел има основен ентитет (getEntity() / setEntity()), но може да съдържа допълнителни ентитети чрез addEntity(). Това е полезно, когато различни части от мрежата споделят една трансформация:
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());
}Сливане на възли
merge() премества всички деца, ентитети и материали от изходен възел към целевия възел. Изходният възел остава празен:
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Следващи стъпки
- Прилагане на трансформации — позициониране, завъртане и мащабиране на всеки възел, използвайки неговия
Transform - Създаване и работа с мрежи — създаване на полигонна геометрия и прикрепяне към възли
Бърз справочник за API
| Член | Описание |
|---|---|
scene.getRootNode() | Корен на сценичното дърво; винаги присъства след new Scene() |
node.createChildNode(name) | Създайте именуван дъщерен възел без ентити |
node.createChildNode(name, entity) | Създайте именуван дъщерен възел с ентитет |
node.createChildNode(name, entity, material) | Създайте именуван дъщерен възел с ентитет и материал |
node.addChildNode(node) | Прикрепете отделно конструиран Node |
node.getChild(name) | Намерете директен дъщерен възел по име; връща null ако не е намерен |
node.getChild(index) | Получете директния дъщерен възел на даден индекс |
node.getChildNodes() | List<Node> от всички директни дъщерни възли |
node.accept(visitor) | Обходете този възел и всички наследници в дълбочина |
node.addEntity(entity) | Прикрепете допълнителен ентитет към възела |
node.getEntities() | List<Entity> на всички ентитети на този възел |
node.setVisible(bool) | Показване или скриване на възела |
node.setExcluded(bool) | Включване или изключване на възела от експорта |
node.merge(other) | Преместване на всички деца и ентитети от other в този възел |