Com carregar models 3D a .NET
Aspose.3D per a .NET ofereix una API senzilla per obrir fitxers 3D sense dependències natives. Després de carregar un fitxer en un objecte Scene, podeu recórrer la jerarquia de nodes i llegir les dades de geometria de cada malla.
Guia pas a pas
Pas 1: Instal·la el paquet
Afegeix el paquet NuGet al teu projecte:
dotnet add package Aspose.3D --version 26.1.0Verifica:
using Aspose.ThreeD;
Console.WriteLine("Aspose.3D loaded.");Pas 2: Importa la classe Scene
La classe Scene és el contenidor de nivell superior per a totes les dades 3D. Importa l’espai de noms:
using Aspose.ThreeD;
using Aspose.ThreeD.Formats;Pas 3: Carrega un fitxer
Utilitzeu Scene.Open() per carregar qualsevol format compatible. La biblioteca detecta el format a partir de l’extensió del fitxer:
var scene = new Scene();
scene.Open("model.obj");O utilitzeu la fàbrica estàtica:
var scene = Scene.FromFile("model.obj");Ambdós admeten OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY i 3MF.
Pas 4: Recórrer nodes d’escena
Una escena carregada és un arbre d’objectes Node arrelat a 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);Cada Node pot portar un Entity (malla, càmera, llum). Comproveu node.Entity abans d’accedir.
Pas 5: Accedir a les dades de vèrtex i polígon
Converteix l’entitat d’un node a Mesh i llegeix els seus punts de control i polígons:
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})");
}
}
}Pas 6: Aplica les opcions de càrrega específiques del format
Per a un control de gran detall, passa una subclasse LoadOptions:
var options = new ObjLoadOptions
{
FlipCoordinateSystem = true,
Scale = 0.01,
EnableMaterials = true
};
var scene = new Scene();
scene.Open("model.obj", options);Altres classes d’opció: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.
Problemes comuns i solucions
ImportException en cridar Scene.Open()
El fitxer pot estar corrupte o en una variant de format no compatible. Verifiqueu que el fitxer s’obre en un visualitzador 3D i que el format estigui a la llista de formats compatibles.
Materials que falten després de carregar OBJ
Col·loca el fitxer .mtl al costat del fitxer .obj i assegura’t que ObjLoadOptions.EnableMaterials = true.
Desajust del sistema de coordenades (el model sembla girat)
Estableix ObjLoadOptions.FlipCoordinateSystem = true o aplica una rotació al Transform del node arrel.
NullReferenceException accedint a node.Entity
No tots els nodes contenen geometria. Comproveu sempre if (node.Entity is Mesh mesh) abans d’accedir a les propietats de la malla.
Preguntes freqüents (FAQ)
Quins formats 3D puc carregar?
OBJ, STL (binari i ASCII), glTF 2.0 / GLB, FBX, COLLADA (DAE), PLY i 3MF.
Puc carregar des d’un flux?
Sí. Scene.Open() accepta un Stream:
using var stream = File.OpenRead("model.glb");
scene.Open(stream);Com puc obtenir les normals de superfície?
Després de carregar, crida mesh.GetElement(VertexElementType.Normal) per accedir a la capa VertexElementNormal.
És la biblioteca segura per a fils?
Cada instància Scene és independent. Carregar fitxers separats en instàncies separades Scene des de fils separats és segur.