Työskentely kohtausgraafin kanssa
Työskentely kohtausgraafin kanssa
Jokainen 3D‑kohta Aspose.3D:ssä .NET:lle on järjestetty puuna, jossa on Node objekteja. Scene.RootNode on kyseisen puun juuri, ja jokainen geometriapala, materiaali ja muunnos sijaitsevat sen alla lapsina tai jälkeläisinä.
Kohtauksen luominen ja juurisolmun hakeminen
Scene alkaa automaattisesti juurisolmulla, jonka nimi on "RootNode":
using Aspose.ThreeD;
var scene = new Scene();
Node root = scene.RootNode; // always "RootNode"Lapsisolmujen lisääminen
Call CreateChildNode() millä tahansa solmulla lisätä lapsi. Metodilla on kolme yleisesti käytettyä ylikuormitusta:
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);Liittääksesi erikseen rakennetun solmun, käytä AddChildNode():
var detached = new Node("standalone");
root.AddChildNode(detached);Lapsisolmujen kysely
Etsi suora lapsi nimen tai indeksin perusteella, tai iteroi kaikki suorat lapset:
// 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) hakee vain suorat lapset, ei koko alipuuta. Käytä rekursiivista apufunktiota tai Accept() etsiäksesi koko puu.
Koko puun läpikäynti
Täydellistä syvyyssuuntaista läpikäyntiä varten, iteroi ChildNodes rekursiivisesti:
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);Aikaiselle poistumiselle suunnatun läpikäynnin yhteydessä, node.Accept(NodeVisitor) on saatavilla ja kutsuu vierailijaa jokaisessa jälkeläisessä, kunnes vierailija palauttaa false.
Ryhmän käyttäminen liittyvien objektien järjestämiseen
Group on säiliöentiteetti, joka loogisesti järjestää solmut ilman geometrian lisäämistä. Kiinnitä se solmuun, jonka lapset edustavat loogista yksikköä:
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));Muutto roomNode muuntaa kaikki huonekalut yhdessä, koska lapset perivät sen Transform.
Näkyvyyden hallinta ja viennin poissulkeminen
Solmuja voidaan piilottaa tai sulkea pois viennistä poistamatta niitä hierarkiasta:
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 on näyttövihje. Excluded = true estää solmun ilmestymisen viedyissä tiedostoissa riippumatta formaatista.
Useiden entiteettien liittäminen yhteen solmuun
Solmulla on ensisijainen entiteetti (Entity ominaisuus), mutta voi sisältää lisäentiteettejä kautta AddEntity(). Tämä on hyödyllistä, kun eri verkko-osat jakavat yhden transformin:
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);Solmujen yhdistäminen
Merge() siirtää kaikki lapset, entiteetit ja materiaalit lähdesolmusta kohdesolmuun. Lähdesolmu jää tyhjäksi:
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 emptySeuraavat askeleet
- Transformien soveltaminen — siirrä, kierrä ja skaalaa mikä tahansa solmu sen avulla
Transform - Alkeismuotojen luominen — käytä
Box,Sphere, jaCylinderscene-entiteetteinä - Verkkojen luominen ja käsittely — rakenna polygonigeometria ja liitä se solmuihin
API:n pikaopas
| Jäsen | Kuvaus |
|---|---|
scene.RootNode | Kohtauksen puun juuri; aina läsnä jälkeen new Scene() |
node.CreateChildNode(name) | Luo nimetty lapsisolmu ilman entiteettiä |
node.CreateChildNode(name, entity) | Luo nimetty lapsisolmu, jossa on entiteetti |
node.CreateChildNode(name, entity, material) | Luo nimetty lapsisolmu, jossa on entiteetti ja materiaali |
node.AddChildNode(node) | Liitä erikseen rakennettu Node |
node.GetChild(name) | Etsi suora lapsi nimen perusteella; palauttaa null jos ei löydy |
node.GetChild(index) | Hae suora lapsi annetussa indeksissä |
node.ChildNodes | IList<Node> kaikista suorista lapsista |
node.Accept(visitor) | Käy läpi tämä solmu ja kaikki jälkeläiset syvyysensuuntaisesti |
node.AddEntity(entity) | Liitä lisäentiteetti solmuun |
node.Entities | IList<Entity> kaikkien entiteettien tässä solmussa |
node.Visible | Näytä tai piilota solmu |
node.Excluded | Sisällytä tai poissulje solmu viennistä |
node.Merge(other) | Siirrä kaikki lapset ja entiteetit kohteesta other tähän solmuun |
new Group(name) | Säiliöentiteetti loogista lapsisolmujen ryhmittelyä varten |