Työskentely kohtausgraafin kanssa

Työskentely kohtausgraafin kanssa

Työskentely kohtausgraafin kanssa

Jokainen 3D‑kohtaus Aspose.3D:ssä Java:lle on järjestetty puuna, jossa on Node objekteja. Scene tarjoaa yhden juuren — getRootNode() — ja jokainen geometriapala, materiaali ja muunnos sijaitsevat sen juuren alla lapsi- tai jälkeläissolmuina.


Kohtauksen luominen ja juurisolmun hakeminen

Scene alkaa automaattisesti juurisolmulla, jonka nimi on "RootNode":

import com.aspose.threed.Scene;
import com.aspose.threed.Node;

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

Lapsisolmujen lisääminen

Kutsu createChildNode() mihin tahansa solmuun lisätäksesi lapsen. Metodilla on kolme yleisesti käytettyä ylikuormitusta:

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);

Liittääksesi erikseen rakennettu solmu, käytä addChildNode():

Node 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) {
    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) hakee vain suoria lapsia, ei koko alipuuta. Käytä accept() etsiäksesi koko puu.


Koko puun läpikäynti

node.accept(NodeVisitor) kävelee solmua ja kaikkia sen jälkeläisiä syvyyssuunnassa. Vierailija palauttaa true jatkaakseen tai false pysäyttääkseen aikaisemmin:

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 on yksittäisen metodin rajapinta, joten se hyväksyy lambdan Java 8+:ssa.


Näkyvyyden hallinta ja viennin poissulkeminen

Solmuja voidaan piilottaa tai sulkea pois viennistä poistamatta niitä hierarkiasta:

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) on näyttövihje. setExcluded(true) estää solmun näkymisen viedyissä tiedostoissa riippumatta tiedostomuodosta.


Useiden entiteettien liittäminen yhteen solmuun

Solmulla on ensisijainen entiteetti (getEntity() / setEntity()), mutta voi pitää lisäentiteettejä kautta addEntity(). Tämä on hyödyllistä, kun eri verkko-osat jakavat yhden muunnoksen:

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());
}

Solmujen yhdistäminen

merge() siirtää kaikki lapset, entiteetit ja materiaalit lähdesolmusta kohdesolmuun. Lähdesolmu jää tyhjäksi:

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

Seuraavat askeleet


API:n pikaopas

JäsenKuvaus
scene.getRootNode()Kohtauksen puun juuri; aina läsnä sen jälkeen new Scene()
node.createChildNode(name)Luo nimetty lapsisolmu ilman entity
node.createChildNode(name, entity)Luo nimetty lapsisolmu entitylla
node.createChildNode(name, entity, material)Luo nimetty lapsisolmu entitylla ja materialilla
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.getChildNodes()List<Node> kaikista suorista lapsista
node.accept(visitor)Käy läpi tämä solmu ja kaikki jälkeläiset syvyyssuunnassa
node.addEntity(entity)Liitä lisäentiteetti solmuun
node.getEntities()List<Entity> kaikkien entiteettien tässä solmussa
node.setVisible(bool)Näytä tai piilota solmu
node.setExcluded(bool)Sisällytä tai poissulje solmu viennistä
node.merge(other)Siirrä kaikki lapset ja entiteetit kohteesta other tähän solmuun
 Suomi