У вступному дописі, ми розглянули, що 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 просторових операцій:

Типи векторів

ТипКомпонентиТочністьЗагальне використання
Vector2X, YfloatUV‑координати текстури
Vector3X, Y, ZfloatВектор загального призначення з 3 компонентами
Vector4X, Y, Z, WfloatКонтрольні точки, нормалі
FVector3X, Y, ZfloatВластивості трансформації (переміщення, масштаб)
FVector4X, Y, Z, WfloatДані елементу вершини

Кватерніон

Кватерніони представляють обертання без гімбального блокування:

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 з опціями завантаження/збереження та шаблонами пакетного перетворення.