В въведителен пост, ние разгледахме какво е 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Параметричен цилиндър с конфигурируеми радиуси на горната/долната част и височина

Тези примитиви могат да се прикрепят директно към възли или да се конвертират в 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

Връхни елементи

Мрежите могат да носят допълнителни слоеве данни за всеки връх, над позициите:

  • 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 с опции за зареждане/запис и шаблони за пакетно конвертиране.