עבודה עם גרף הסצנה

עבודה עם גרף הסצנה

עבודה עם גרף הסצנה

כל סצנה תלת‑ממדית ב‑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) מטייל בצומת ובכל הצאצאים שלו בסדר עומק‑קודם. המבקר מחזיר 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 operations

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

הצעדים הבאים


הפניה מהירה ל-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 אל הצומת הזה
 עברית