Εργασία με το Scene Graph
Εργασία με το Scene Graph
Κάθε σκηνή 3D στο Aspose.3D για .NET οργανώνεται ως ένα δέντρο του Node αντικειμένων . Scene.RootNode Είναι η ρίζα αυτού του δέντρου και κάθε κομμάτι της γεωμετρίας, υλικού και μετασχηματισμού ζωής κάτω από αυτό ως παιδί ή απογόνους.
Δημιουργία σκηνής και πρόσβαση στο κόμβο ρίζας
Scene αρχικά με ένα ρίζον κώνημα που ονομάζεται "RootNode":
using Aspose.ThreeD;
var scene = new Scene();
Node root = scene.RootNode; // always "RootNode"Προσθήκη παιδικών ντομάτας
Κλήση CreateChildNode() Σε κάθε κόμβο για να προσθέσετε ένα παιδί. η μέθοδος έχει τρεις κοινά χρησιμοποιούμενες υπερφόρτωση:
using Aspose.ThreeD;
using Aspose.ThreeD.Entities;
var scene = new Scene();
Node root = scene.RootNode;
// 1. Named node with no entity — useful as a pivot or transform container
Node pivot = root.CreateChildNode("pivot");
// 2. Named node with an entity
var box = new Box(2, 2, 2);
Node boxNode = root.CreateChildNode("box", box);
// 3. Named node with entity and material
var mat = new Aspose.ThreeD.Shading.PhongMaterial("red");
mat.Diffuse = new Vector4(0.8, 0.2, 0.2, 1.0);
Node decorated = pivot.CreateChildNode("red_box", box, mat);Για να προσθέσετε ένα κέλυφος που κατασκευάζεται ξεχωριστά, χρησιμοποιήστε AddChildNode():
var 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)
Console.WriteLine("Found: " + found.Name);
// By index
Node first = root.GetChild(0);
// Iterate all direct children
foreach (Node child in root.ChildNodes)
Console.WriteLine(child.Name);
GetChild(string name)μόνο αναζητώντας Εξυπηρετούν τα παιδιά, όχι το πλήρες υποδέντρο. χρησιμοποιήστε ένα αναδρομικό βοηθός ήAccept()Να ψάχνουμε ολόκληρο το δέντρο.
Περπατώντας το πλήρες δέντρο
Για ένα πλήρες βάθος πρώτος περπάτημα, iterate ChildNodes Επαναλαμβανόμενος :
static void Walk(Node node, int depth = 0)
{
Console.WriteLine(new string(' ', depth * 2) + node.Name);
foreach (var child in node.ChildNodes)
Walk(child, depth + 1);
}
Walk(scene.RootNode);Για την έξοδο από το ταξίδι, node.Accept(NodeVisitor) είναι διαθέσιμο και καλεί τον επισκέπτη σε κάθε απογόνους μέχρι την επιστροφή του επισκέπτεται. false.
Χρησιμοποιώντας την ομάδα για να οργανώσει σχετικούς αντικείμενα
Group είναι μια οντότητα δοχείου που οργανώνει λογικά τα κόμβα χωρίς να προσθέτει γεωμετρία. Συνδέστε το με ένα κόμμα των οποίων τα παιδιά αντιπροσωπεύουν μια λογική μονάδα:
using Aspose.ThreeD;
using Aspose.ThreeD.Entities;
var scene = new Scene();
// A group node for all furniture in a room
var furnitureGroup = new Group("furniture");
Node roomNode = scene.RootNode.CreateChildNode("living_room", furnitureGroup);
// Child nodes under the group node
Node sofaNode = roomNode.CreateChildNode("sofa", new Box(3, 1, 1));
Node tableNode = roomNode.CreateChildNode("coffee_table", new Box(2, 0.5, 1));Μετακίνηση roomNode μετατρέπουν όλα τα έπιπλα μαζί, επειδή τα παιδιά κληρονομήσουν το Transform.
Ελέγχου της ορατότητας και εξαίρεσης των εξαγωγών
Οι ντόνες μπορούν να κρυφτούν ή να αποκλειστούν από την εξαγωγή χωρίς να αφαιρεθούν από τη ιεραρχία:
Node ground = scene.RootNode.CreateChildNode("ground_plane", new Box(100, 0.1, 100));
ground.Visible = false; // hidden in viewport / renderer
Node helperNode = scene.RootNode.CreateChildNode("debug_arrow", new Box());
helperNode.Excluded = true; // omitted from all export operationsVisible = false Είναι μια δείξη. Excluded = true εμποδίζει το κόμβο να εμφανίζεται σε εξαγωγικά αρχεία ανεξάρτητα από τη μορφή.
Προσθήκη πολλαπλών οντοτήτων σε ένα κόμβο
Το κέλυφος έχει ένα Πρωτοβάθμια Οργανισμός (Entity (α) μπορεί να έχει πρόσθετες οντότητες μέσω της AddEntity().Αυτό είναι χρήσιμο όταν διαφορετικά κομμάτια μαστού μοιράζονται μια ενιαία μεταμόρφωση:
var bodyMesh = new Mesh("body");
var wheelMesh = new Mesh("wheel");
Node carNode = scene.RootNode.CreateChildNode("car");
carNode.AddEntity(bodyMesh);
carNode.AddEntity(wheelMesh);
// Retrieve all entities on this node
foreach (Entity ent in carNode.Entities)
Console.WriteLine(ent.GetType().Name + ": " + ent.Name);Μειώνοντας Νότσια
Merge() μετακινεί όλα τα παιδιά, τις οντότητες και τα υλικά από ένα κενό πηγής στο στόχο.:
Node lod0 = scene.RootNode.CreateChildNode("lod0");
lod0.CreateChildNode("mesh_high", new Box(1, 1, 1));
Node lod1 = scene.RootNode.CreateChildNode("lod1");
lod1.CreateChildNode("mesh_low", new Box(1, 1, 1));
// Consolidate lod0 children into lod1
lod1.Merge(lod0);
// lod1 now has both mesh_high and mesh_low; lod0 is emptyΕπόμενο Βήματα
- Εφαρμογή μετασχηματισμών - θέσης, περιστροφής και κλίμακας κάθε κόμβου χρησιμοποιώντας το
Transform - Δημιουργία προκαταρκτικής γεωμετρίας - Χρησιμοποιήστε
Box,Sphere,καιCylinderΩς οντότητες σκηνής - Δημιουργία και εργασία με τα ματς - να χτίσει γεωμετρία πολυγώνου και να το προσθέσει σε κόμβους
ΑΡΧΙΚΗ ΑΝΑΓΝΩΜΗΣΗ
| Μέλος | Περιγραφή |
|---|---|
scene.RootNode | Η ρίζα του δέντρου της σκηνής, πάντα παρούσα μετά από 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.ChildNodes | IList<Node> από όλα τα άμεσα παιδιά |
node.Accept(visitor) | Περπατήστε αυτό το κόμβο και όλες οι απογόνες πρώτα βαθιά |
node.AddEntity(entity) | Προσθήκη πρόσθετης οντότητας στο κόμβο |
node.Entities | IList<Entity> Όλες οι οντότητες σε αυτό το κόμβο |
node.Visible | Εμφάνιση ή κρύβοντας το κουτί |
node.Excluded | Συμπεριλάβετε ή αποκλείστε το κόμβο από την εξαγωγή |
node.Merge(other) | Να μετακινήσουν όλα τα παιδιά και τις οντότητες από την other Σε αυτό το νουβέλι |
new Group(name) | Οντότητα δοχείου για τη λογική συγκέντρωση παιδικών κόμβων |