Cách tải mô hình 3D trong .NET

Cách tải mô hình 3D trong .NET

Aspose.3D for .NET cung cấp một API đơn giản để mở các tệp 3D mà không cần phụ thuộc gốc. Sau khi tải tệp vào một đối tượng Scene, bạn có thể duyệt qua cây node và đọc dữ liệu hình học cho mỗi mesh.

Hướng Dẫn Từng Bước

Bước 1: Cài đặt gói

Thêm gói NuGet vào dự án của bạn:

dotnet add package Aspose.3D --version 26.1.0

Xác minh:

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

Bước 2: Nhập lớp Scene

Lớp Scene là container cấp cao nhất cho tất cả dữ liệu 3D. Nhập không gian tên:

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

Bước 3: Tải tệp

Sử dụng Scene.Open() để tải bất kỳ định dạng nào được hỗ trợ. Thư viện phát hiện định dạng từ phần mở rộng của tệp:

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

Hoặc sử dụng static factory:

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

Cả hai đều hỗ trợ OBJ, STL, glTF 2.0 / GLB, FBX, COLLADA, PLY và 3MF.


Bước 4: Duyệt các nút cảnh

Một cảnh đã tải là một cây các đối tượng Node có gốc tại 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);

Mỗi Node có thể mang một Entity (lưới, máy ảnh, đèn). Kiểm tra node.Entity trước khi truy cập.


Bước 5: Truy cập dữ liệu đỉnh và đa giác

Ép kiểu thực thể của nút sang Mesh và đọc các điểm điều khiển và đa giác của nó:

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

Bước 6: Áp dụng các tùy chọn tải theo định dạng

Để kiểm soát chi tiết, truyền một lớp con LoadOptions:

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

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

Các lớp tùy chọn khác: FbxLoadOptions, GltfLoadOptions, StlLoadOptions, ColladaLoadOptions, PlyLoadOptions.


Các vấn đề thường gặp và cách khắc phục

ImportException khi gọi Scene.Open()

Tệp có thể bị hỏng hoặc ở dạng biến thể không được hỗ trợ. Kiểm tra tệp có mở được trong trình xem 3D và định dạng có nằm trong danh sách được hỗ trợ hay không.

Thiếu vật liệu sau khi tải OBJ

Đặt tệp .mtl bên cạnh tệp .obj và đảm bảo ObjLoadOptions.EnableMaterials = true.

Sự không khớp hệ tọa độ (mô hình xuất hiện bị xoay)

Đặt ObjLoadOptions.FlipCoordinateSystem = true hoặc áp dụng một phép quay cho Transform của nút gốc.

NullReferenceException truy cập node.Entity

Không phải mọi nút đều chứa hình học. Luôn kiểm tra if (node.Entity is Mesh mesh) trước khi truy cập các thuộc tính lưới.


Câu hỏi thường gặp (FAQ)

Các định dạng 3D nào tôi có thể tải?

OBJ, STL (nhị phân và ASCII), glTF 2.0 / GLB, FBX, COLLADA (DAE), PLY và 3MF.

Có thể tải từ luồng không?

Vâng. Scene.Open() chấp nhận một Stream:

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

Làm sao để lấy các vector pháp tuyến bề mặt?

Sau khi tải, gọi mesh.GetElement(VertexElementType.Normal) để truy cập lớp VertexElementNormal.

Thư viện có an toàn với đa luồng không?

Mỗi thể hiện Scene là độc lập. Việc tải các tệp riêng biệt vào các thể hiện Scene riêng biệt từ các luồng riêng biệt là an toàn.

 Tiếng Việt