Làm việc với Scene Graph

Làm việc với Scene Graph

Làm việc với Scene Graph

Mỗi cảnh 3D trong Aspose.3D cho Java được tổ chức như một cây của Node đối tượng . Scene Một cái rễ duy nhất - getRootNode() - và mỗi mảnh của địa chất, vật liệu, và biến đổi cuộc sống dưới gốc đó như một đứa trẻ hoặc các nút kế thừa.


Tạo cảnh và truy cập vào nút gốc

Scene tự động khởi động với một nút gốc được đặt tên "RootNode":

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

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

Thêm trẻ em nodes

gọi điện createChildNode() trên bất kỳ nút để thêm một đứa trẻ. phương pháp có ba quá tải thường được sử dụng:

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);

Để gắn một nút được xây dựng riêng biệt, sử dụng addChildNode():

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

Tìm kiếm trẻ em Node

Tìm một đứa trẻ trực tiếp theo tên hoặc chỉ số, hoặc iterate tất cả các đứa con trực tuyến:

// 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) Tìm kiếm chỉ Trẻ em trực tiếp,Không phải là cái bông trần.Nhưng nó accept() chỉ truy cập vào cái gọi là nút; iterate getChildNodes() Lần này, tìm kiếm toàn bộ cây.


Đi qua cây đầy đủ

node.accept(NodeVisitor) chỉ ghé thăm cái gọi là nút - nó không quay trở lại trẻ em. để vượt qua cây đầy, iterate getChildNodes() Lời bài hát: The Visitor Returns true để tiếp tục hoặc false Để dừng sớm:

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 là một giao diện phương pháp duy nhất, vì vậy nó chấp nhận lambda trong Java 8+.


Kiểm soát khả năng hiển thị và ngoại lệ xuất khẩu

Các nút có thể được ẩn hoặc loại trừ khỏi xuất khẩu mà không bị xóa ra khỏi hiến pháp:

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) là một biểu tượng. setExcluded(true) ngăn chặn nút xuất hiện trong các tệp được xuất khẩu bất kể định dạng.


Kết nối nhiều entities vào một nút

Một nút có một nguyên nhân Động vật (getEntity() / setEntity()(c) nhưng có thể giữ thêm các đơn vị thông qua addEntity().Điều này hữu ích khi các mảnh vải khác nhau chia sẻ một chuyển đổi duy nhất:

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());
}

Nhập Node

merge() chuyển tất cả trẻ em, các thể chất và vật liệu từ một nút nguồn vào nút mục tiêu.:

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 nhanh chóng tham khảo

Thành viênMô tả
scene.getRootNode()Rễ của cây cảnh; luôn hiện diện sau khi new Scene()
node.createChildNode(name)Tạo một nút trẻ em có tên không có thực thể
node.createChildNode(name, entity)Tạo một nút trẻ em có tên với một thực thể
node.createChildNode(name, entity, material)Tạo một nút trẻ em có tên với bản chất và vật liệu
node.addChildNode(node)- Thay vào một cách riêng biệt xây dựng Node
node.getChild(name)Tìm một đứa trẻ trực tiếp theo tên; trở lại null Nếu không tìm thấy
node.getChild(index)Nhận con người trực tiếp tại một chỉ số nhất định
node.getChildNodes()List<Node> Tất cả trẻ em trực tiếp
node.accept(visitor)Chỉ truy cập nút này (không quay lại với trẻ em)
node.addEntity(entity)Thêm một entity vào nút
node.getEntities()List<Entity> Tất cả các đơn vị trên nút này
node.setVisible(bool)Hiển thị hoặc ẩn nút
node.setExcluded(bool)- Chèn hoặc loại trừ nút từ xuất khẩu
node.merge(other)Chuyển tất cả trẻ em và các tổ chức từ other vào node này
 Tiếng Việt