วิธีโหลดโมเดล 3 มิติใน .NET

วิธีโหลดโมเดล 3 มิติใน .NET

Aspose.3D for .NET ให้ API ที่ตรงไปตรงมาสำหรับการเปิดไฟล์ 3D โดยไม่มีการพึ่งพาเนทีฟ หลังจากโหลดไฟล์เข้าสู่วัตถุ 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.


ขั้นตอนที่ 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) เสมอก่อนเข้าถึง mesh properties.


คำถามที่พบบ่อย (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);

ฉันจะรับ normal ของพื้นผิวได้อย่างไร?

หลังจากโหลดแล้ว ให้เรียก mesh.GetElement(VertexElementType.Normal) เพื่อเข้าถึงชั้น VertexElementNormal.

ไลบรารีปลอดภัยต่อการทำงานหลายเธรดหรือไม่?

แต่ละอินสแตนซ์ Scene เป็นอิสระ การโหลดไฟล์แยกต่างหากเข้าสู่อินสแตนซ์ Scene แยกต่างหากจากเธรดแยกต่างหากนั้นปลอดภัย.

 ภาษาไทย