씬 그래프 작업
씬 그래프 작업
모든 3D 씬은 Aspose.3D for .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 operationsVisible = false 표시 힌트입니다. Excluded = true 형식에 관계없이 노드가 내보낸 파일에 나타나는 것을 방지합니다.
Attaching Multiple Entities to One Node
노드에는 기본 entity (Entity property), 하지만 추가 엔티티를 통해 보유할 수 있습니다 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);Merging Nodes
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 emptyNext Steps
- 변환 적용 — 위치, 회전 및 스케일을 노드에 적용합니다
Transform - 기본 기하학 생성 — 사용
Box,Sphere, 및Cylinder를 씬 엔티티로 - 메시 생성 및 작업 — 폴리곤 기하를 만들고 노드에 연결합니다
API Quick Reference
| 멤버 | 설명 |
|---|---|
scene.RootNode | 씬 트리의 루트; 항상 존재합니다 new Scene() |
node.CreateChildNode(name) | 엔티티가 없는 명명된 자식 노드 생성 |
node.CreateChildNode(name, entity) | 엔티티가 있는 명명된 자식 노드 생성 |
node.CreateChildNode(name, entity, material) | 엔티티와 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) | 자식 노드를 논리적으로 그룹화하기 위한 컨테이너 엔터티 |