У вступному дописі, ми розглянули, що Aspose.3D FOSS для .NET таке і як розпочати. Цей допис докладніше розглядає ключові функції, які складають бібліотеку, з прикладами коду для кожної області.
Усі приклади передбачають наступну директиву using:
using Aspose.ThreeD;
using Aspose.ThreeD.Entities;
using Aspose.ThreeD.Shading;
І пакет NuGet:
dotnet add package Aspose.3D --version 26.1.0
Граф сцени
Сцена граф — це основна структура даних. A Scene містить RootNode, і кожен Node може мати дочірні вузли та приєднаний Entity (наприклад, a Mesh або Camera).
Створення та навігація вузлів
var scene = new Scene();
// Create a hierarchy
var parent = scene.RootNode.CreateChildNode("Parent");
var child1 = parent.CreateChildNode("Child1");
var child2 = parent.CreateChildNode("Child2");
// Navigate the tree
Console.WriteLine("Root children: " + scene.RootNode.ChildNodes.Count);
Console.WriteLine("Parent children: " + parent.ChildNodes.Count);
Прикріплення Entity до вузлів
Сутності — це візуальний вміст сцени – сітки, камери та освітлення. Прикріплюйте їх за допомогою CreateChildNode:
var scene = new Scene();
// Create a box primitive and attach it to the scene
var box = new Box(2, 2, 2);
var boxNode = scene.RootNode.CreateChildNode("BoxNode", box);
// Create a sphere primitive
var sphere = new Sphere(1);
var sphereNode = scene.RootNode.CreateChildNode("SphereNode", sphere);
scene.Save("primitives.gltf");
Вбудовані примітиви
Видання .NET включає параметричні класи форм, які генерують геометрію без ручного створення вершин:
| Примітив | Опис |
|---|---|
Box | Вісь-орієнтований паралелепіпед з налаштовуваною шириною, висотою та глибиною |
Sphere | Параметрична сфера з налаштовуваним радіусом |
Cylinder | Параметричний циліндр з налаштовуваними радіусами верхньої/нижньої частини та висотою |
Ці примітиви можна прикріпити безпосередньо до вузлів або перетворити на Mesh через ToMesh():
var cylinder = new Cylinder(1, 1, 2);
var mesh = cylinder.ToMesh();
Console.WriteLine("Vertices: " + mesh.ControlPoints.Count);
Console.WriteLine("Polygons: " + mesh.PolygonCount);
Конструювання сітки
Якщо потрібен повний контроль, створюйте сітки з нуля, використовуючи контрольні точки та визначення полігонів:
var mesh = new Mesh();
// Add vertex positions
mesh.ControlPoints.Add(new Vector4(0, 0, 0, 1.0f));
mesh.ControlPoints.Add(new Vector4(1, 0, 0, 1.0f));
mesh.ControlPoints.Add(new Vector4(0.5f, 1, 0, 1.0f));
// Define a triangle face
mesh.CreatePolygon(0, 1, 2);
// Attach to a scene
var scene = new Scene();
scene.RootNode.CreateChildNode("triangle", mesh);
scene.Save("triangle.stl");
Контрольні точки використовують Vector4 з w компонент встановлений у 1.0f для стандартних декартових позицій. Полігони визначаються передачею індексів контрольних точок до CreatePolygon().
Трансформації
Кожен Node має Transform властивість, яка керує його локальним положенням, обертанням та масштабом:
var scene = new Scene();
var node = scene.RootNode.CreateChildNode("Moved");
node.Transform.Translation = new FVector3(5, 0, 0);
node.Transform.Scale = new FVector3(2, 2, 2);
Успадкування трансформації
Трансформації комбінуються через ієрархію сцени. Позиція об’єкта у світовому просторі є результатом множення всіх трансформацій предків:
var scene = new Scene();
var parent = scene.RootNode.CreateChildNode("Parent");
parent.Transform.Translation = new FVector3(10, 0, 0);
var child = parent.CreateChildNode("Child");
child.Transform.Translation = new FVector3(5, 0, 0);
// Child's world position is (15, 0, 0)
// Access via child.GlobalTransform
GlobalTransform
Тільки для читання GlobalTransform властивість кожного Node надає обчислену матрицю трансформації у світовому просторі після композиції всіх трансформацій предків. Доступ до результату здійснюється через node.GlobalTransform.Matrix.
Матеріали
Бібліотека містить три типи матеріалів з підвищеною складністю:
LambertMaterial
Класичний матеріал лише з дифузним розсіюванням:
var material = new LambertMaterial("WoodMaterial");
material.Diffuse = new Vector4(0.6f, 0.4f, 0.2f, 1.0f);
material.Ambient = new Vector4(0.1f, 0.1f, 0.1f, 1.0f);
material.Transparency = 0.0f;
PhongMaterial
Розширює Lambert, додаючи спекулярні підсвічування:
var material = new PhongMaterial("ShinyMetal");
material.Specular = new Vector4(0.8f, 0.8f, 0.8f, 1.0f);
material.Shininess = 50.0f;
material.SpecularPower = 32.0f;
PbrMaterial
Матеріал фізично‑основаного рендерингу, що використовується у glTF 2.0:
var material = new PbrMaterial("GoldPBR");
material.BaseColor = new Vector4(1.0f, 0.8f, 0.2f, 1.0f);
material.Metallic = 0.9f;
material.Roughness = 0.1f;
material.Occlusion = 1.0f;
PBR‑матеріали підтримують слоти текстур для базового кольору, металевості/шорсткості, нормалей, емісії та карт оклюзії через властивості рядкових шляхів до текстур.
Математичні утиліти
Бібліотека надає набір математичних примітивів для 3D просторових операцій:
Типи векторів
| Тип | Компоненти | Точність | Загальне використання |
|---|---|---|---|
Vector2 | X, Y | float | UV‑координати текстури |
Vector3 | X, Y, Z | float | Вектор загального призначення з 3 компонентами |
Vector4 | X, Y, Z, W | float | Контрольні точки, нормалі |
FVector3 | X, Y, Z | float | Властивості трансформації (переміщення, масштаб) |
FVector4 | X, Y, Z, W | float | Дані елементу вершини |
Кватерніон
Кватерніони представляють обертання без гімбального блокування:
var rotation = new Quaternion(0, 0, 0, 1); // Identity
node.Transform.Rotation = rotation;
Matrix4
4x4 transformation matrices for composing transforms:
// Matrix operations are used internally by Transform
// and GlobalTransform for world-space computation
BoundingBox
Вісі-орієнтовані обмежувальні коробки для просторових запитів:
// BoundingBox stores Minimum and Maximum FVector3 corners
// Used for frustum culling and spatial partitioning
Вершинні елементи
Сітки можуть містити додаткові шари даних на вершину, крім позицій:
- VertexElementNormal – нормалі поверхні для розрахунків освітлення.
- VertexElementUV – координати текстури для проєкції зображень на геометрію.
- VertexElementVertexColor – дані кольору RGBA для кожної вершини.
Кожен елемент вершини має MappingMode (для контрольної точки, вершини полігону або полігону) і ReferenceMode (прямі значення або індексовані значення).
Анімаційні кліпи
Цей Scene клас підтримує іменовані анімаційні кліпи через CreateAnimationClip() та GetAnimationClip(). У поточному FOSS-виданні створення та пошук анімаційних кліпів працюють, але дані ключових кадрів та відтворення ще не реалізовані.
var scene = new Scene();
var clip = scene.CreateAnimationClip("Walk");
// Retrieve by name
var found = scene.GetAnimationClip("Walk");
Console.WriteLine("Clip found: " + (found != null));
Що далі
Наступний пост охоплює роботу з 3D форматами файлів у .NET – практичний покроковий посібник по форматах OBJ, STL, glTF, FBX та 3MF з опціями завантаження/збереження та шаблонами пакетного перетворення.