Jak ładować modele 3D w .NET
Aspose.3D for .NET zapewnia prosty interfejs API do otwierania plików 3D bez zależności natywnych. Po załadowaniu pliku do obiektu Scene możesz przejść przez hierarchię węzłów i odczytać dane geometryczne dla każdej siatki.
Przewodnik krok po kroku
Krok 1: Zainstaluj pakiet
Dodaj pakiet NuGet do swojego projektu:
dotnet add package Aspose.3D --version 26.1.0Zweryfikuj:
using Aspose.ThreeD;
Console.WriteLine("Aspose.3D loaded.");Krok 2: Importuj klasę Scene
Klasa Scene jest kontenerem najwyższego poziomu dla wszystkich danych 3D. Zaimportuj przestrzeń nazw:
using Aspose.ThreeD;
using Aspose.ThreeD.Formats;Krok 3: Załaduj plik
Użyj Scene.Open(), aby wczytać dowolny obsługiwany format. Biblioteka wykrywa format na podstawie rozszerzenia pliku:
var scene = new Scene();
scene.Open("model.obj");Lub użyj statycznej fabryki:
var scene = Scene.FromFile("model.obj");Oba obsługują OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY i 3MF.
Krok 4: Przeglądaj węzły sceny
Załadowana scena jest drzewem obiektów Node z korzeniem w 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);Każdy Node może zawierać Entity (siatka, kamera, światło). Sprawdź node.Entity przed dostępem.
Krok 5: Dostęp do danych wierzchołków i wielokątów
Rzutuj encję węzła na Mesh i odczytaj jej punkty kontrolne oraz wielokąty:
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})");
}
}
}Krok 6: Zastosuj opcje ładowania specyficzne dla formatu
Aby uzyskać precyzyjną kontrolę, przekaż podklasę LoadOptions:
var options = new ObjLoadOptions
{
FlipCoordinateSystem = true,
Scale = 0.01,
EnableMaterials = true
};
var scene = new Scene();
scene.Open("model.obj", options);Inne klasy opcji: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.
Typowe problemy i rozwiązania
ImportException podczas wywoływania Scene.Open()
Plik może być uszkodzony lub w nieobsługiwanym wariancie formatu. Sprawdź, czy plik otwiera się w przeglądarce 3D i czy format znajduje się na liście obsługiwanych.
Brakujące materiały po załadowaniu OBJ
Umieść plik .mtl obok pliku .obj i zapewnij ObjLoadOptions.EnableMaterials = true.
Niezgodność systemu współrzędnych (model wydaje się obrócony)
Ustaw ObjLoadOptions.FlipCoordinateSystem = true lub zastosuj obrót do Transform węzła głównego.
NullReferenceException uzyskiwanie dostępu do node.Entity
Nie każdy węzeł zawiera geometrię. Zawsze sprawdzaj if (node.Entity is Mesh mesh) przed dostępem do właściwości siatki.
Najczęściej zadawane pytania (FAQ)
Jakie formaty 3D mogę załadować?
OBJ, STL (binarny i ASCII), glTF 2.0 / GLB, FBX, COLLADA (DAE), PLY oraz 3MF.
Czy mogę wczytać ze strumienia?
Tak. Scene.Open() akceptuje Stream:
using var stream = File.OpenRead("model.glb");
scene.Open(stream);Jak uzyskać wektory normalne powierzchni?
Po załadowaniu wywołaj mesh.GetElement(VertexElementType.Normal), aby uzyskać dostęp do warstwy VertexElementNormal.
Czy biblioteka jest bezpieczna wątkowo?
Każda instancja Scene jest niezależna. Ładowanie oddzielnych plików do oddzielnych instancji Scene z osobnych wątków jest bezpieczne.