В вводный пост, мы рассмотрели, что такое 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‑пространственных операций:
Типы векторов
| Тип | Компоненты | Точность | Общее использование |
|---|---|---|---|
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
Элементы вершин
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 с опциями загрузки/сохранения и шаблонами пакетного преобразования.