Εργασία με το Γράφημα Σκηνής
Εργασία με το Γράφημα Σκηνής
Κάθε 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"Προσθήκη Κόμβων-Παιδιών
Call 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 είναι μια διεπαφή με μία μέθοδο, έτσι αποδέχεται μια lambda στο 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 σε αυτόν τον κόμβο |