.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 클래스 가져오기

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를 지원합니다.


Step 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);

Node은(는) Entity(mesh, camera, light)를 가질 수 있습니다. 접근하기 전에 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 (binary 및 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 인스턴스로 로드하는 것은 안전합니다.

 한국어