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:
| Beskrivelse | Aksialt justert boks med konfigurerbar bredde, høyde og dybde |
|---|---|
Box | Parametrisk kule med konfigurerbar radius |
Sphere | Parametrisk sylinder med konfigurerbare topp-/bunnradier og høyde |
Cylinder | Disse 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
| Type | Komponenter | Presisjon | Vanlig bruk |
|---|---|---|---|
Vector2 | X, Y | float | UV-teksturkoordinater |
Vector3 | X, Y, Z | float | Generell 3-komponent vektor |
Vector4 | X, Y, Z, W | float | Kontrollpunkter, normaler |
FVector3 | X, Y, Z | float | Transformasjons-egenskaper (Translasjon, Skala) |
FVector4 | X, Y, Z, W | float | Vertex-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.