シーン グラフの操作
シーン グラフの操作
Aspose.3D の .NET 用のすべての 3D シーンは、ツリーの構造として編成されています Node オブジェクト。. Scene.RootNode はそのツリーのルートであり、ジオメトリ、マテリアル、トランスフォームのすべての要素は子または子孫としてその下に存在します。.
シーンの作成とルートノードへのアクセス
Scene は自動的に、名前が付けられたルートノードで初期化されます "RootNode":
using Aspose.ThreeD;
var scene = new Scene();
Node root = scene.RootNode; // always "RootNode"子ノードの追加
呼び出す CreateChildNode() 任意のノードで子を追加します。このメソッドには、一般的に使用される 3 つのオーバーロードがあります::
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 フォーマットに関係なく、エクスポートされたファイルにノードが表示されないようにします。.
1つのノードに複数のエンティティをアタッチする
ノードは プライマリ エンティティ (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次のステップ
- 変換の適用 — 位置、回転、スケールを任意のノードで使用します
Transform - プリミティブジオメトリの作成 — 使用
Box,Sphere,、およびCylinderシーンエンティティとして - メッシュの作成と操作 — ポリゴンジオメトリを構築し、ノードにアタッチする
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.ChildNodes | IList<Node> すべての直接子の |
node.Accept(visitor) | このノードとすべての子孫を深さ優先で走査する |
node.AddEntity(entity) | ノードに追加のエンティティを添付する |
node.Entities | IList<Entity> このノード上のすべてのエンティティの |
node.Visible | ノードを表示または非表示にする |
node.Excluded | エクスポートにノードを含めるか除外する |
node.Merge(other) | すべての子とエンティティを~から移動する other このノードへ |
new Group(name) | 子ノードを論理的にグループ化するためのコンテナエンティティ |