सीन ग्राफ के साथ काम करना

सीन ग्राफ के साथ काम करना

सीन ग्राफ के साथ काम करना

हर 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 (Entity property), लेकिन अतिरिक्त entities को … के माध्यम से रख सकता है AddEntity(). यह उपयोगी है जब विभिन्न mesh टुकड़े एक ही transform साझा करते हैं:

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() सभी बच्चों, entities, और materials को स्रोत नोड से लक्ष्य नोड में ले जाता है। स्रोत नोड खाली रह जाता है:

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नोड को export से शामिल या बाहर करें
node.Merge(other)सभी children और entities को यहाँ से ले जाएँ other इस node में
new Group(name)Container entity child nodes को तार्किक रूप से समूहित करने के लिए
 हिन्दी