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:
| Primitiv | Beskrivelse |
|---|---|
Box | Aksialt justeret boks med konfigurerbar bredde, højde og dybde |
Sphere | Parametrisk kugle med konfigurerbar radius |
Cylinder | Parametrisk 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
| Type | Komponenter | Præcision | Almindelig brug |
|---|---|---|---|
Vector2 | X, Y | float | UV-teksturkoordinater |
Vector3 | X, Y, Z | float | Generel 3-komponent vektor |
Vector4 | X, Y, Z, W | float | Kontrolpunkter, normaler |
FVector3 | X, Y, Z | float | Transformegenskaber (Translation, Scale) |
FVector4 | X, Y, Z, W | float | Vertex-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.