I introduktionsinlägg, vi täckte vad Aspose.3D FOSS för .NET är och hur man kommer igång. Detta inlägg går djupare in på nyckelfunktionerna som utgör biblioteket, med kodexempel för varje område.

Alla exempel förutsätter följande using‑direktiv:

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

Och NuGet‑paketet:

dotnet add package Aspose.3D --version 26.1.0

Scengrafen

Scengrafen är den centrala datastrukturen. En Scene innehåller en RootNode, och varje Node kan ha barnnoder och en bifogad Entity (till exempel en Mesh eller Camera).

Skapa och navigera 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);

Bifoga entiteter till noder

Entiteter är det visuella innehållet i scenen – meshar, kameror och ljus. Fäst dem med hjälp av 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");

Inbyggda primitivformer

Versionen .NET inkluderar parametriska formklasser som genererar geometri utan manuell vertexkonstruktion:

PrimitiveBeskrivning
BoxAxelrätad låda med konfigurerbar bredd, höjd och djup
SphereParametrisk sfär med konfigurerbar radie
CylinderParametrisk cylinder med konfigurerbara topp-/bottenradier och höjd

Dessa primitiv kan fästas direkt på noder eller konverteras till 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);

Meshkonstruktion

Om du behöver full kontroll, bygg meshar från grunden med hjälp av kontrollpunkter och 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");

Kontrollpunkter använder Vector4 med w komponent inställd på 1.0f för standard kartesiska positioner. Polygoner definieras genom att skicka kontrollpunktsindex till CreatePolygon().

Transformationer

Varje Node har en Transform egenskap som styr dess lokala position, rotation och 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);

Transformarv

Transformar komponeras genom scenhierarkin. Ett barns position i världsrummet är produkten av alla förfäders transformeringar:

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 skrivskyddade GlobalTransform egenskapen på varje Node tillhandahåller den beräknade transformationsmatrisen i världsrummet efter att ha sammansatt alla föräldratransformeringar. Åtkomst till resultatet via node.GlobalTransform.Matrix.

Material

Biblioteket innehåller tre materialtyper med ökande komplexitet:

LambertMaterial

Klassiskt material som bara har diffus reflektion:

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

Utökar Lambert med spekulära högdagrar:

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

Fysikbaserat renderingsmaterial som används 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-material stödjer texturplatser för basfärg, metallisk/roughness, normal, emissiv och ocklusjonskartor via strängbaserade egenskaper för texturväg.

Matematikverktyg

Biblioteket tillhandahåller en uppsättning matematiska primitiv för 3D‑rumsliga operationer:

Vektortyper

TypKomponenterPrecisionVanlig användning
Vector2X, YfloatUV-texturkoordinater
Vector3X, Y, ZfloatAllmännyttig 3-komponentsvektor
Vector4X, Y, Z, WfloatKontrollpunkter, normaler
FVector3X, Y, ZfloatTransformegenskaper (Translation, Scale)
FVector4X, Y, Z, WfloatVertex-elementdata

Quaternion

Quaternions representerar rotationer utan 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

Axeljusterade avgränsningsboxar för rumsliga frågor:

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

Vertex-element

Meshar kan bära ytterligare per-vertex-datalager utöver positioner:

  • VertexElementNormal – ytnormaler för ljusberäkningar.
  • VertexElementUV – texturkoordinater för att mappa bilder på geometri.
  • VertexElementVertexColor – per-vertex RGBA-färgddata.

Varje vertex-element har en MappingMode (per kontrollpunkt, per polygonvertex eller per polygon) och en ReferenceMode (direkta värden eller indexerade värden).

Animationsklipp

Den Scene klassen stöder namngivna animationsklipp via CreateAnimationClip() och GetAnimationClip(). I den nuvarande FOSS-utgåvan är skapande och uppslagning av animationsklipp funktionella, men nyckelramdata och uppspelning är ännu inte implementerade.

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

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

Vad blir nästa

Nästa inlägg täcker arbete med 3D-filformat i .NET – en praktisk, format-för-format guide till OBJ, STL, glTF, FBX och 3MF med laddnings-/sparalternativ och batchkonverteringsmönster.