I introduksjonsinnlegg, vi dekket hva Aspose.3D FOSS for .NET er og hvordan man kommer i gang. Dette innlegget går dypere inn i nøkkelfunksjonene som utgjør biblioteket, med kodeeksempler for hvert område.

Alle eksempler forutsetter følgende using‑direktiv:

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

Og NuGet‑pakken:

dotnet add package Aspose.3D.Converter --version 1.0.0

Scene‑grafen

Scenegrafen er kjernedatastrukturen. En Scene inneholder en RootNode,kan ha undernoder og en vedlagt Node (som en Entity eller Mesh Entiteter er det visuelle innholdet i scenen – mesh, kameraer og lys. Fest dem ved å bruke Camera).

Opprette og navigere noder

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

Knytte entiteter til noder

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

Innebygde primitive

Den .NET-utgaven inkluderer parametriske formklasser som genererer geometri uten manuell vertex‑konstruksjon:

BeskrivelseAksialt justert boks med konfigurerbar bredde, høyde og dybde
BoxParametrisk kule med konfigurerbar radius
SphereParametrisk sylinder med konfigurerbare topp-/bunnradier og høyde
CylinderDisse primitive kan festes direkte til noder eller konverteres til en

en Mesh via ToMesh():

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

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

Mesh‑konstruksjon

Hvis du trenger full kontroll, bygg mesh‑er fra bunnen av ved å bruke kontrollpunkter og polygon‑definisjoner:

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

Kontrollpunkter bruker Vector4 med w komponent satt til 1.0f for standard kartesiske posisjoner. Polygoner defineres ved å sende kontrollpunktindekser til CreatePolygon().

Transformasjoner

Hver Node har en Transform egenskap som styrer dens lokale posisjon, rotasjon og skala:

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

Transform-arv

Transformasjoner komponeres gjennom scenehierarkiet. Et barns posisjon i verdensrommet er produktet av alle foreldertransformasjoner:

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

Den skrivebeskyttede GlobalTransform egenskapen på hver Node gir den beregnede transformasjonsmatrisen i verdensrommet etter å ha sammensatt alle foreldertransformasjoner. Få tilgang til resultatet via node.GlobalTransform.Matrix.

Materialer

Biblioteket inneholder tre materialtyper med økende kompleksitet:

LambertMaterial

Klassisk kun-diffus materiale:

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

Utvider Lambert med speilende høydepunkter:

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

Fysisk basert renderingsmateriale brukt av 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-materialer støtter teksturplasser for basisfarge, metallisk/grovhet, normal, emissiv og okklusjonskart via streng‑tekstur‑sti‑egenskaper.

Matematikkverktøy

Biblioteket tilbyr et sett med matematiske primitive for 3D-romlige operasjoner:

Vektortyper

TypeKomponenterPresisjonVanlig bruk
Vector2X, YfloatUV-teksturkoordinater
Vector3X, Y, ZfloatGenerell 3-komponent vektor
Vector4X, Y, Z, WfloatKontrollpunkter, normaler
FVector3X, Y, ZfloatTransformasjons-egenskaper (Translasjon, Skala)
FVector4X, Y, Z, WfloatVertex-elementdata

Quaternion

Quaternions representerer rotasjoner uten gimbal lock:

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

Aksjejusterte avgrensningsbokser for romlige spørringer:

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

Vertex-elementer

Mesh-er kan inneholde ekstra per-vertex-datalag utover posisjoner:

  • VertexElementNormal – overflatenormale for lysberegninger.
  • VertexElementUV – teksturkoordinater for å kartlegge bilder på geometri.
  • VertexElementVertexColor – per-vertex RGBA-fargedata.

Hvert vertex-element har en MappingMode (per kontrollpunkt, per polygon-vertex eller per polygon) og en ReferenceMode (direkte verdier eller indekserte verdier).

Animasjonsklipp

Den Scene klassen støtter navngitte animasjonsklipp via CreateAnimationClip() og GetAnimationClip(). I den nåværende FOSS-utgaven er opprettelse og oppslag av animasjonsklipp funksjonelle, men nøkkelrammedata og avspilling er ennå ikke implementert.

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

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

Hva blir neste?

Det neste innlegget dekker arbeid med 3D-filformater i .NET – en praktisk, format-for-format guide til OBJ, STL, glTF, FBX og 3MF med last/lagre-alternativer og batch-konverteringsmønstre.