シーン グラフの操作
シーン グラフの操作
Aspose.3D の Java 用のすべての 3D シーンは、ツリー構造として編成されています 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() 任意のノードで子を追加します。このメソッドには、一般的に使用される 3 つのオーバーロードがあります::
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) ノードとそのすべての子孫を深さ優先順に走査します。ビジターは返します 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) フォーマットに関係なく、エクスポートされたファイルにノードが表示されるのを防ぎます。.
1つのノードに複数のエンティティをアタッチする
ノードは プライマリ エンティティ(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 このノードに |