Im Einführungsbeitrag, wir haben behandelt, was Aspose.3D FOSS für .NET ist und wie man anfängt. Dieser Beitrag geht tiefer auf die wichtigsten Funktionen ein, aus denen die Bibliothek besteht, mit Codebeispielen für jeden Bereich.

Alle Beispiele gehen von der folgenden using-Direktive aus:

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

Und das NuGet-Paket:

dotnet add package Aspose.3D --version 26.1.0

Der Szenengraph

Der Szenengraph ist die Kern-Datenstruktur. Ein Scene enthält ein RootNode, und jeder Node kann Kindknoten und ein angehängtes Entity (wie ein Mesh oder Camera).

Erstellen und Navigieren von Knoten

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

Anhängen von Entities an Knoten

Entitäten sind der visuelle Inhalt der Szene – Meshes, Kameras und Lichter. Befestige sie mit 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");

Eingebaute Primitive

Die .NET-Edition enthält parametrische Formklassen, die Geometrie erzeugen, ohne dass man Vertices manuell konstruieren muss:

PrimitiveBeschreibung
BoxAchsenbündige Box mit konfigurierbarer Breite, Höhe und Tiefe
SphereParametrische Kugel mit konfigurierbarem Radius
CylinderParametrischer Zylinder mit konfigurierbaren oberen/unteren Radien und Höhe

Diese Primitive können direkt an Knoten angehängt oder in ein Mesh über 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

Wenn du volle Kontrolle brauchst, erstelle Meshes von Grund auf mit Kontrollpunkten und Polygondefinitionen:

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

Steuerpunkte verwenden Vector4 mit dem w Komponente gesetzt auf 1.0f für standardmäßige kartesische Positionen. Polygone werden definiert, indem Steuerpunktindizes an CreatePolygon().

Transformationen

Jeder Node hat ein Transform Eigenschaft, die ihre lokale Position, Rotation und Skalierung steuert:

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-Vererbung

Transformations werden über die Szenenhierarchie zusammengesetzt. Die Weltposition eines Kindes ist das Produkt aller übergeordneten Transformations:

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

Die schreibgeschützte GlobalTransform Eigenschaft jedes Node liefert die berechnete Transformationsmatrix im Weltkoordinatensystem, nachdem alle übergeordneten Transformationen zusammengesetzt wurden. Greifen Sie auf das Ergebnis zu über node.GlobalTransform.Matrix.

Materialien

Die Bibliothek enthält drei Materialtypen mit zunehmender Komplexität:

LambertMaterial

Klassisches reines Diffus‑Material:

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

Erweitert Lambert um spekulare Glanzlichter:

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

Physically based Rendering‑Material, das von glTF 2.0 verwendet wird:

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‑Materialien unterstützen Textur‑Slots für Basisfarbe, Metallisch/Rauheit, Normalen, Emission und Occlusion‑Karten über String‑Texturpfad‑Eigenschaften.

Mathematische Hilfsfunktionen

Die Bibliothek stellt eine Reihe von mathematischen Grundoperationen für 3D‑räumliche Vorgänge bereit:

Vektor‑Typen

TypKomponentenGenauigkeitTypische Verwendung
Vector2X, YfloatUV-Texturkoordinaten
Vector3X, Y, ZfloatAllgemeiner 3-Komponenten-Vektor
Vector4X, Y, Z, WfloatSteuerpunkte, Normalen
FVector3X, Y, ZfloatTransformations-Eigenschaften (Translation, Skalierung)
FVector4X, Y, Z, WfloatVertex-Elementdaten

Quaternion

Quaternionen stellen Rotationen ohne Gimbal-Lock dar:

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

Achsenorientierte Begrenzungsboxen für räumliche Abfragen:

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

Vertex-Elemente

Meshes können zusätzliche pro-Vertex-Datenebenen über die Positionen hinaus tragen:

  • VertexElementNormal – Oberflächennormalen für Beleuchtungsberechnungen.
  • VertexElementUV – Texturkoordinaten zum Abbilden von Bildern auf Geometrie.
  • VertexElementVertexColor – per-Vertex RGBA-Farb-Daten.

Jedes Vertex-Element hat ein MappingMode (pro Kontrollpunkt, pro Polygon-Vertex oder pro Polygon) und ein ReferenceMode (direkte Werte oder indizierte Werte).

Animationsclips

Der Scene Klasse unterstützt benannte Animationsclips über CreateAnimationClip() und GetAnimationClip(). Im aktuellen FOSS-Edition sind das Erstellen und Nachschlagen von Animationsclips funktional, aber Keyframe-Daten und Wiedergabe sind noch nicht implementiert.

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

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

Was kommt als Nächstes

Der nächste Beitrag behandelt Arbeiten mit 3D-Dateiformaten in .NET – ein praktischer, format‑für‑format Leitfaden zu OBJ, STL, glTF, FBX und 3MF mit Lade‑/Speicheroptionen und Batch‑Konvertierungsmustern.