Εργασία με το Γράφημα Σκηνής

Εργασία με το Γράφημα Σκηνής

Εργασία με το Γράφημα Σκηνής

Κάθε 3D σκηνή στο Aspose.3D για .NET οργανώνεται ως ένα δέντρο από Node αντικείμενα. Scene.RootNode είναι η ρίζα αυτού του δέντρου και κάθε κομμάτι γεωμετρίας, υλικού και μετασχηματισμού βρίσκεται κάτω από αυτό ως παιδί ή απόγονος.


Δημιουργία της Σκηνής και Πρόσβαση στη Ριζικό Κόμβο

Scene αρχικοποιείται αυτόματα με έναν κόμβο ρίζας με όνομα "RootNode":

using Aspose.ThreeD;

var scene = new Scene();
Node root = scene.RootNode; // always "RootNode"

Προσθήκη Κόμβων-Παιδιών

Call 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() για να αναζητήσετε ολόκληρο το δέντρο.


Διασχίζοντας το Πλήρες Δέντρο

Για μια πλήρη διάσχιση βάθους-πρώτα, επαναλάβετε 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 για οργάνωση σχετικών αντικειμένων

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 operations

Visible = 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

Επόμενα Βήματα


Σύντομη Αναφορά API

ΜέλοςΠεριγραφή
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.ChildNodesIList<Node> από όλα τα άμεσα παιδιά
node.Accept(visitor)Περιηγηθείτε σε αυτόν τον κόμβο και σε όλους τους απογόνους βάθος-πρώτα
node.AddEntity(entity)Επισυνάψτε μια πρόσθετη οντότητα στον κόμβο
node.EntitiesIList<Entity> από όλες τις οντότητες σε αυτόν τον κόμβο
node.VisibleΕμφάνιση ή απόκρυψη του κόμβου
node.ExcludedΣυμπερίληψη ή εξαίρεση του κόμβου από την εξαγωγή
node.Merge(other)Μετακινήστε όλα τα παιδιά και τις οντότητες από other σε αυτόν τον κόμβο
new Group(name)Οντότητα δοχείου για λογική ομαδοποίηση των παιδικών κόμβων
 Ελληνικά