.NETで3Dモデルをロードする方法

.NETで3Dモデルをロードする方法

Aspose.3D for .NET は、ネイティブ依存関係なしで 3D ファイルを開くためのシンプルな API を提供します。ファイルを Scene オブジェクトにロードした後、ノード階層をたどり、すべてのメッシュのジオメトリ データを読み取ることができます。

ステップバイステップ ガイド

ステップ 1: パッケージをインストールする

プロジェクトに NuGet パッケージを追加してください:

dotnet add package Aspose.3D --version 26.1.0

確認:

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

ステップ 2: シーン クラスのインポート

Scene クラスは、すべての 3D データのトップレベル コンテナです。名前空間をインポートします:

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

ステップ 3: ファイルを読み込む

Scene.Open() を使用して、サポートされている任意の形式をロードします。ライブラリはファイル拡張子から形式を検出します:

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

または静的ファクトリを使用する:

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

どちらも OBJ、STL、glTF 2.0 / GLB、FBX、COLLADA、PLY、そして 3MF をサポートしています。


ステップ 4: シーン ノードを走査

ロードされたシーンは、Node オブジェクトのツリーで、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);

NodeEntity(メッシュ、カメラ、ライト)を持つことがあります。アクセスする前にnode.Entityを確認してください。


ステップ5: 頂点とポリゴンデータにアクセス

ノードのエンティティを Mesh にキャストして、制御点とポリゴンを読み取ります:

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

ステップ 6: フォーマット固有のロードオプションを適用

細かい制御を行うには、LoadOptions サブクラスを渡します:

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

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

その他のオプションクラス: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions


一般的な問題と対処法

ImportException 呼び出すとき Scene.Open()

ファイルが破損しているか、サポートされていない形式のバリエーションである可能性があります。ファイルが3Dビューアで開くことを確認し、形式がサポートリストに含まれているか確認してください。

OBJロード後のマテリアルが欠落

.mtl ファイルを .obj ファイルの横に配置し、ObjLoadOptions.EnableMaterials = true を確実にしてください。

座標系の不一致(モデルが回転しているように見える)

ObjLoadOptions.FlipCoordinateSystem = true を設定するか、ルートノードの Transform に回転を適用します。

NullReferenceException アクセス中 node.Entity

すべてのノードがジオメトリを持っているわけではありません。メッシュプロパティにアクセスする前に、必ず if (node.Entity is Mesh mesh) を確認してください。


よくある質問 (FAQ)

どの3Dフォーマットをロードできますか?

OBJ、STL(バイナリおよびASCII)、glTF 2.0 / GLB、FBX、COLLADA(DAE)、PLY、そして3MF。

ストリームからロードできますか?

はい。Scene.Open()Stream を受け入れます:

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

サーフェス法線を取得するにはどうすればよいですか?

ロード後、mesh.GetElement(VertexElementType.Normal) を呼び出して VertexElementNormal レイヤーにアクセスします。

ライブラリはスレッドセーフですか?

Scene インスタンスは独立しています。別々のスレッドから別々の Scene インスタンスに別々のファイルをロードすることは安全です。

 日本語