I introduktionsindlæg, vi dækkede hvad Aspose.3D FOSS for .NET er, og hvordan man kommer i gang. Dette indlæg går dybere ind i de vigtigste funktioner, der udgør biblioteket, med kodeeksempler for hvert område.

Alle eksempler antager følgende using‑direktiv:

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

Og NuGet-pakken:

dotnet add package Aspose.3D --version 26.1.0

Scenegrafen

Scenegrafen er den centrale datastruktur. En Scene indeholder en RootNode, og hver Node kan have undernoder og en vedhæftet Entity (såsom en Mesh eller Camera).

Oprettelse og navigation af 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);

Vedhæftning af enheder til noder

Entiteter er det visuelle indhold i scenen – mesh’er, kameraer og lys. Tilknyt dem ved hjælp af 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");

Indbyggede primitive

Den .NET udgave indeholder parametriske formklasser, der genererer geometri uden manuel vertex‑konstruktion:

PrimitivBeskrivelse
BoxAksialt justeret boks med konfigurerbar bredde, højde og dybde
SphereParametrisk kugle med konfigurerbar radius
CylinderParametrisk cylinder med konfigurerbare top-/bundradius og højde

Disse primitive kan vedhæftes direkte til noder eller konverteres til 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‑konstruktion

Hvis du har brug for fuld kontrol, kan du bygge mesh’er fra bunden ved hjælp af kontrolpunkter og polygondefinitioner:

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

Kontrolpunkter bruger Vector4 med w komponent sat til 1.0f for standard kartesiske positioner. Polygoner defineres ved at videregive kontrolpunktindekser til CreatePolygon().

Transformationer

Hver Node har en Transform egenskab, der styrer dens lokale position, rotation og skalering:

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

Transformarv

Transformationer sammensættes gennem scenens hierarki. Et barns position i verdensrum er produktet af alle forældrestransformationer:

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 egenskab på hver Node leverer den beregnede transformation matrix i verdensrum efter at have sammensat alle forældrestransformationer. Få adgang til resultatet via node.GlobalTransform.Matrix.

Materialer

Biblioteket indeholder tre materialetyper med stigende 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

Udvider Lambert med spekulære højdepunkter:

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 baseret renderingsmateriale brugt af 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 understøtter teksturslots til grundfarve, metallisk/ruhed, normal, emissiv og okklusionskort via streng‑tekstursti‑egenskaber.

Matematikværktøjer

Biblioteket leverer et sæt matematiske primitive til 3D rumlige operationer:

Vektortyper

TypeKomponenterPræcisionAlmindelig brug
Vector2X, YfloatUV-teksturkoordinater
Vector3X, Y, ZfloatGenerel 3-komponent vektor
Vector4X, Y, Z, WfloatKontrolpunkter, normaler
FVector3X, Y, ZfloatTransformegenskaber (Translation, Scale)
FVector4X, Y, Z, WfloatVertex-elementdata

Quaternion

Quaternions repræsenterer rotationer uden 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

Akseljusterede begrænsningsbokse til rumlige forespørgsler:

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

Vertex-elementer

Meshes kan bære ekstra per-vertex-datalag ud over positioner:

  • VertexElementNormal – overfladenormaller til lysberegninger.
  • VertexElementUV – teksturkoordinater til at kortlægge billeder på geometri.
  • VertexElementVertexColor – per-vertex RGBA-farvedata.

Hvert vertex-element har en MappingMode (per kontrolpunkt, per polygon-vertex eller per polygon) og en ReferenceMode (direkte værdier eller indekserede værdier).

Animation Clips

Den Scene klasse understøtter navngivne animationsklip via CreateAnimationClip() og GetAnimationClip(). I den aktuelle FOSS-udgave er oprettelse og opslag af animationsklip funktionelle, men keyframe-data og afspilning er endnu ikke implementeret.

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

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

Hvad er næste

Det næste indlæg dækker arbejde med 3D-filformater i .NET – en praktisk, format-for-format guide til OBJ, STL, glTF, FBX og 3MF med indlæsnings-/gemmeindstillinger og batchkonverteringsmønstre.