Εργασία με το Scene Graph

Εργασία με το Scene Graph

Εργασία με το Scene Graph

Κάθε σκηνή 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() επισκέπτεται μόνο το λεγόμενο κόμβο· iterate getChildNodes() Να αναζητήσουμε ολόκληρο το δέντρο.


Περπατώντας το πλήρες δέντρο

node.accept(NodeVisitor) επισκέπτεται μόνο το λεγόμενο κόμβο - δεν αναρρέει στα παιδιά. για να περάσει μέσα από το πλήρες δέντρο, ιθεράει getChildNodes() Επαναφορά: Ο επισκέπτης επιστρέφει 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 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


ΑΡΧΙΚΗ ΑΝΑΓΝΩΜΗΣΗ

ΜέλοςΠεριγραφή
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 Σε αυτό το νουβέλι
 Ελληνικά