В вводный пост, мы рассмотрели, что такое 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 содержит a 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);

Присоединение сущностей к узлам

Сущности — это визуальное содержимое сцены — сетки, камеры и источники света. Присоединяйте их с помощью 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Параметрический цилиндр с настраиваемыми радиусами верхней/нижней части и высотой

Эти примитивы можно напрямую присоединять к узлам или преобразовывать в a 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

Элементы вершин

Meshes могут содержать дополнительные слои данных на вершине, помимо позиций:

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