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:
| Primitive | Beskrivning |
|---|---|
Box | Axelrätad låda med konfigurerbar bredd, höjd och djup |
Sphere | Parametrisk sfär med konfigurerbar radie |
Cylinder | Parametrisk 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
| Typ | Komponenter | Precision | Vanlig användning |
|---|---|---|---|
Vector2 | X, Y | float | UV-texturkoordinater |
Vector3 | X, Y, Z | float | Allmännyttig 3-komponentsvektor |
Vector4 | X, Y, Z, W | float | Kontrollpunkter, normaler |
FVector3 | X, Y, Z | float | Transformegenskaper (Translation, Scale) |
FVector4 | X, Y, Z, W | float | Vertex-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.