Hur man laddar 3D-modeller i .NET
Aspose.3D för .NET tillhandahåller ett enkelt API för att öppna 3D-filer utan inhemska beroenden. Efter att ha laddat en fil i ett Scene‑objekt kan du gå igenom nodhierarkin och läsa geometridata för varje mesh.
Steg-för-steg-guide
Steg 1: Installera paketet
Lägg till NuGet‑paketet i ditt projekt:
dotnet add package Aspose.3D --version 26.1.0Verifiera:
using Aspose.ThreeD;
Console.WriteLine("Aspose.3D loaded.");Steg 2: Importera Scene‑klassen
Klassen Scene är den översta behållaren för all 3D‑data. Importera namnutrymmet:
using Aspose.ThreeD;
using Aspose.ThreeD.Formats;Steg 3: Ladda en fil
Använd Scene.Open() för att läsa in valfritt stödd format. Biblioteket upptäcker formatet från filändelsen:
var scene = new Scene();
scene.Open("model.obj");Eller använd den statiska fabriken:
var scene = Scene.FromFile("model.obj");Båda stödjer OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY och 3MF.
Steg 4: Traversera scennoder
En laddad scen är ett träd av Node-objekt rotad vid scene.RootNode:
void Walk(Node node, int depth = 0)
{
var indent = new string(' ', depth * 2);
Console.WriteLine($"{indent}Node: {node.Name}");
foreach (var child in node.ChildNodes)
Walk(child, depth + 1);
}
Walk(scene.RootNode);Varje Node kan ha en Entity (mesh, kamera, ljus). Kontrollera node.Entity innan du får åtkomst.
Steg 5: Åtkomst till vertex- och polygondata
Kasta en nods entitet till Mesh och läs dess kontrollpunkter och polygoner:
using Aspose.ThreeD.Entities;
foreach (var node in scene.RootNode.ChildNodes)
{
if (node.Entity is Mesh mesh)
{
Console.WriteLine($"Mesh '{node.Name}': " +
$"{mesh.ControlPoints.Count} vertices, " +
$"{mesh.PolygonCount} polygons");
if (mesh.ControlPoints.Count > 0)
{
var v = mesh.ControlPoints[0];
Console.WriteLine($" First vertex: ({v.X:F4}, {v.Y:F4}, {v.Z:F4})");
}
}
}Steg 6: Använd format‑specifika inläsningsalternativ
För finjusterad kontroll, skicka en LoadOptions underklass:
var options = new ObjLoadOptions
{
FlipCoordinateSystem = true,
Scale = 0.01,
EnableMaterials = true
};
var scene = new Scene();
scene.Open("model.obj", options);Andra alternativklasser: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.
Vanliga problem och lösningar
ImportException vid anrop av Scene.Open()
Filen kan vara skadad eller i en formatvariant som inte stöds. Verifiera att filen öppnas i en 3D‑visare och att formatet finns i den stödda listan.
Saknade material efter OBJ‑laddning
Placera .mtl-filen bredvid .obj-filen och säkerställ ObjLoadOptions.EnableMaterials = true.
Koordinatsystemfel (modellen verkar roterad)
Ställ in ObjLoadOptions.FlipCoordinateSystem = true eller applicera en rotation på rotnodens Transform.
NullReferenceException åtkomst till node.Entity
Inte varje nod har geometri. Kontrollera alltid if (node.Entity is Mesh mesh) innan du får åtkomst till mesh‑egenskaper.
Vanliga frågor (FAQ)
Vilka 3D-format kan jag ladda?
OBJ, STL (binär och ASCII), glTF 2.0 / GLB, FBX, COLLADA (DAE), PLY och 3MF.
Kan jag läsa in från en ström?
Ja. Scene.Open() accepterar en Stream:
using var stream = File.OpenRead("model.glb");
scene.Open(stream);Hur får jag ytnormaler?
Efter laddning, anropa mesh.GetElement(VertexElementType.Normal) för att komma åt VertexElementNormal-lagret.
Är biblioteket trådsäkert?
Varje Scene-instans är oberoende. Att ladda separata filer i separata Scene-instanser från separata trådar är säkert.