Comment charger des modèles 3D dans .NET

Comment charger des modèles 3D dans .NET

Aspose.3D for .NET fournit une API simple pour ouvrir des fichiers 3D sans dépendances natives. Après avoir chargé un fichier dans un objet Scene, vous pouvez parcourir la hiérarchie des nœuds et lire les données géométriques de chaque maillage.

Guide étape par étape

Étape 1 : Installer le package

Ajoutez le package NuGet à votre projet:

dotnet add package Aspose.3D --version 26.1.0

Vérifier :

using Aspose.ThreeD;
Console.WriteLine("Aspose.3D loaded.");

Étape 2 : Importer la classe Scene

La classe Scene est le conteneur de niveau supérieur pour toutes les données 3D. Importez l’espace de noms :

using Aspose.ThreeD;
using Aspose.ThreeD.Formats;

Étape 3 : Charger un fichier

Utilisez Scene.Open() pour charger tout format pris en charge. La bibliothèque détecte le format à partir de l’extension du fichier :

var scene = new Scene();
scene.Open("model.obj");

Ou utilisez la fabrique statique :

var scene = Scene.FromFile("model.obj");

Les deux prennent en charge OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY et 3MF.


Étape 4 : Parcourir les nœuds de la scène

Une scène chargée est un arbre d’objets Node dont la racine est 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);

Chaque Node peut contenir un Entity (mesh, camera, light). Vérifiez node.Entity avant d’accéder.


Étape 5 : Accéder aux données de sommets et de polygones

Convertissez l’entité d’un nœud en Mesh et lisez ses points de contrôle et ses polygones :

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

Étape 6 : Appliquer les options de chargement spécifiques au format

Pour un contrôle fin, passez une sous‑classe LoadOptions :

var options = new ObjLoadOptions
{
    FlipCoordinateSystem = true,
    Scale = 0.01,
    EnableMaterials = true
};

var scene = new Scene();
scene.Open("model.obj", options);

Autres classes d’options : FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.


Problèmes courants et solutions

ImportException lors de l’appel de Scene.Open()

Le fichier peut être corrompu ou dans une variante de format non prise en charge. Vérifiez que le fichier s’ouvre dans un visualiseur 3D et que le format figure dans la liste des formats pris en charge.

Matériaux manquants après le chargement OBJ

Placez le fichier .mtl à côté du fichier .obj et assurez ObjLoadOptions.EnableMaterials = true.

Incompatibilité du système de coordonnées (le modèle apparaît tourné)

Définissez ObjLoadOptions.FlipCoordinateSystem = true ou appliquez une rotation au Transform du nœud racine.

NullReferenceException accédant à node.Entity

Tous les nœuds ne portent pas de géométrie. Vérifiez toujours if (node.Entity is Mesh mesh) avant d’accéder aux propriétés du maillage.


Foire aux questions (FAQ)

Quels formats 3D puis-je charger ?

OBJ, STL (binaire et ASCII), glTF 2.0 / GLB, FBX, COLLADA (DAE), PLY et 3MF.

Puis-je charger à partir d’un flux ?

Oui. Scene.Open() accepte un Stream:

using var stream = File.OpenRead("model.glb");
scene.Open(stream);

Comment obtenir les normales de surface ?

Après le chargement, appelez mesh.GetElement(VertexElementType.Normal) pour accéder à la couche VertexElementNormal.

La bibliothèque est‑elle thread‑safe ?

Chaque instance Scene est indépendante. Charger des fichiers distincts dans des instances Scene distinctes à partir de threads séparés est sûr.

 Français