.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 인스턴스로 로드하는 것은 안전합니다.