U uvodnom postu, pokrili smo što Aspose.3D FOSS za .NET jest i kako započeti. Ovaj post dublje istražuje ključne značajke koje čine biblioteku, s kodnim primjerima za svako područje.

Svi primjeri pretpostavljaju sljedeću using direktivu:

using Aspose.ThreeD;
using Aspose.ThreeD.Entities;
using Aspose.ThreeD.Shading;

I NuGet paket:

dotnet add package Aspose.3D --version 26.1.0

Graf scene

Scene graf je osnovna struktura podataka. A Scene sadrži RootNode,i svaki Node može imati podčvorove i priloženi Entity (kao što je Mesh ili Camera).

Stvaranje i navigacija čvorova

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);

Pridruživanje entiteta čvorovima

Entiteti su vizualni sadržaj scene – mreže, kamere i svjetla. Priložite ih koristeći 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");

Ugrađene primitive

Izdanja .NET uključuje parametarske klase oblika koje generiraju geometriju bez ručnog konstruiranja vrhova:

PrimitivOpis
BoxOsovinski poravnan kutija s podesivom širinom, visinom i dubinom
SphereParametrijska sfera s podesivim radijusom
CylinderParametrijski cilindar s podesivim radijusima vrha/dna i visinom

Ovi primitivni objekti mogu se izravno priložiti čvorovima ili pretvoriti u Mesh preko ToMesh():

var cylinder = new Cylinder(1, 1, 2);
var mesh = cylinder.ToMesh();

Console.WriteLine("Vertices: " + mesh.ControlPoints.Count);
Console.WriteLine("Polygons: " + mesh.PolygonCount);

Konstrukcija mreže

Ako trebate potpunu kontrolu, izgradite mreže od početka koristeći kontrolne točke i definicije poligona:

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");

Kontrolne točke koriste Vector4 s w komponenta postavljena na 1.0f za standardne kartezijanske položaje. Poligoni se definiraju prosljeđivanjem indeksa kontrolnih točaka u CreatePolygon().

Transformacije

Svaki Node ima Transform svojstvo koje kontrolira njegov lokalni položaj, rotaciju i skaliranje:

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);

Nasljeđivanje transformacija

Transformacije se sastavljaju kroz hijerarhiju scene. Svijetovna pozicija djeteta je proizvod svih transformacija pretka:

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

Samo za čitanje GlobalTransform svojstvo na svakom Node pruža izračunatu matricu transformacije u svjetskom prostoru nakon sastavljanja svih transformacija pretka. Pristupite rezultatu putem node.GlobalTransform.Matrix.

Materijali

Biblioteka uključuje tri tipa materijala s rastućom složenošću:

LambertMaterial

Klasični materijal samo s difuzijom:

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

Proširuje Lambert s refleksijskim naglascima:

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

Materijal temeljena na fizički zasnovanom renderiranju koji koristi 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 materijali podržavaju teksturne slotove za osnovnu boju, metalnost/ hrapavost, normalu, emisivnost i mape zaklonjenosti putem svojstava putanje teksture tipa string.

Matematički alati

Biblioteka pruža skup matematičkih primitiva za 3D prostorne operacije:

Tipovi vektora

TipKomponentePreciznostUobičajena upotreba
Vector2X, YfloatUV koordinate teksture
Vector3X, Y, ZfloatVektor opće namjene s 3 komponente
Vector4X, Y, Z, WfloatKontrolne točke, normale
FVector3X, Y, ZfloatSvojstva transformacije (Translacija, Skaliranje)
FVector4X, Y, Z, WfloatPodaci elementa vrha

Kvaternion

Kvaternioni predstavljaju rotacije bez gimbal locka:

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

Okviri poravnati s osima za prostorne upite:

// BoundingBox stores Minimum and Maximum FVector3 corners
// Used for frustum culling and spatial partitioning

Elementi vrha

Mreže mogu nositi dodatne slojeve podataka po vrhu, izvan pozicija:

  • VertexElementNormal – površinski normali za izračune osvjetljenja.
  • VertexElementUV – koordinate teksture za mapiranje slika na geometriju.
  • VertexElementVertexColor – podaci o boji RGBA po vrhu.

Svaki element vrha ima MappingMode (po kontrolnoj točki, po vrhu poligona ili po poligonu) i ReferenceMode (izravne vrijednosti ili indeksirane vrijednosti).

Isječci animacije

Klasa Scene podržava imenovane animacijske isječke putem CreateAnimationClip() i GetAnimationClip(). U trenutnoj FOSS izdanju, stvaranje i pretraživanje animacijskih isječaka su funkcionalni, ali podaci ključnih okvira i reprodukcija još nisu implementirani.

var scene = new Scene();
var clip = scene.CreateAnimationClip("Walk");

// Retrieve by name
var found = scene.GetAnimationClip("Walk");
Console.WriteLine("Clip found: " + (found != null));

Što slijedi

Sljedeći post pokriva rad s 3D formatima datoteka u .NET – praktični, format-po-format vodič za OBJ, STL, glTF, FBX i 3MF s opcijama učitavanja/spremanja i obrascima grupne konverzije.