Trong bài viết giới thiệu, chúng tôi đã đề cập đến Aspose.3D FOSS cho .NET là gì và cách bắt đầu. Bài viết này đi sâu hơn vào các tính năng chính tạo nên thư viện, kèm theo các ví dụ mã cho mỗi khu vực.

Tất cả các ví dụ giả định chỉ thị using sau:

using Aspose.ThreeD;
using Aspose.ThreeD.Entities;
using Aspose.ThreeD.Shading;

Và gói NuGet:

dotnet add package Aspose.3D --version 26.1.0

Đồ thị Cảnh

Đồ thị cảnh là cấu trúc dữ liệu cốt lõi. A Scene chứa một RootNode, và mọi Node có thể có các nút con và một tệp đính kèm Entity (ví dụ như một) Mesh hoặc Camera).

Tạo và Duyệt các Node

var scene = new Scene();

// Create a hierarchy
var parent = scene.RootNode.CreateChildNode("Parent");
var child1 = parent.CreateChildNode("Child1");
var child2 = parent.CreateChildNode("Child2");

// Navigate the tree
Console.WriteLine("Root children: " + scene.RootNode.ChildNodes.Count);
Console.WriteLine("Parent children: " + parent.ChildNodes.Count);

Gắn Entity vào Node

Các thực thể là nội dung hình ảnh của cảnh – meshes, cameras và lights. Gắn chúng bằng CreateChildNode:

var scene = new Scene();

// Create a box primitive and attach it to the scene
var box = new Box(2, 2, 2);
var boxNode = scene.RootNode.CreateChildNode("BoxNode", box);

// Create a sphere primitive
var sphere = new Sphere(1);
var sphereNode = scene.RootNode.CreateChildNode("SphereNode", sphere);

scene.Save("primitives.gltf");

Các Hình Học Cơ Bản Tích Hợp

Phiên bản .NET bao gồm các lớp hình dạng tham số tạo ra hình học mà không cần xây dựng đỉnh thủ công:

nguyên thủyMô tả
BoxHộp căn trục với chiều rộng, chiều cao và độ sâu có thể cấu hình
SphereHình cầu tham số với bán kính có thể cấu hình
CylinderTrụ tham số với bán kính trên/dưới có thể cấu hình và chiều cao

Các primitive này có thể được gắn trực tiếp vào các nút hoặc chuyển đổi thành một Mesh qua ToMesh():

var cylinder = new Cylinder(1, 1, 2);
var mesh = cylinder.ToMesh();

Console.WriteLine("Vertices: " + mesh.ControlPoints.Count);
Console.WriteLine("Polygons: " + mesh.PolygonCount);

Xây Dựng Mesh

Nếu bạn cần kiểm soát hoàn toàn, hãy xây dựng mesh từ đầu bằng cách sử dụng các điểm điều khiển và định nghĩa đa giác:

var mesh = new Mesh();

// Add vertex positions
mesh.ControlPoints.Add(new Vector4(0, 0, 0, 1.0f));
mesh.ControlPoints.Add(new Vector4(1, 0, 0, 1.0f));
mesh.ControlPoints.Add(new Vector4(0.5f, 1, 0, 1.0f));

// Define a triangle face
mesh.CreatePolygon(0, 1, 2);

// Attach to a scene
var scene = new Scene();
scene.RootNode.CreateChildNode("triangle", mesh);
scene.Save("triangle.stl");

Các điểm kiểm soát sử dụng Vector4 với w thành phần được đặt thành 1.0f cho các vị trí Cartesian tiêu chuẩn. Các đa giác được định nghĩa bằng cách truyền các chỉ số điểm điều khiển tới CreatePolygon().

Biến Đổi

Mỗi Node có một Transform thuộc tính kiểm soát vị trí, góc quay và tỉ lệ cục bộ của nó:

var scene = new Scene();

var node = scene.RootNode.CreateChildNode("Moved");
node.Transform.Translation = new FVector3(5, 0, 0);
node.Transform.Scale = new FVector3(2, 2, 2);

Kế thừa Transform

Các Transform được ghép qua cây cảnh. Vị trí không gian thế giới của một nút con là tích của tất cả các Transform của các tổ tiên:

var scene = new Scene();

var parent = scene.RootNode.CreateChildNode("Parent");
parent.Transform.Translation = new FVector3(10, 0, 0);

var child = parent.CreateChildNode("Child");
child.Transform.Translation = new FVector3(5, 0, 0);

// Child's world position is (15, 0, 0)
// Access via child.GlobalTransform

GlobalTransform

Thuộc tính chỉ đọc GlobalTransform trên mỗi Node cung cấp ma trận biến đổi không gian thế giới đã tính toán sau khi kết hợp tất cả các biến đổi của tổ tiên. Truy cập kết quả qua node.GlobalTransform.Matrix.

Vật liệu

Thư viện bao gồm ba loại vật liệu với độ phức tạp tăng dần:

LambertMaterial

Vật liệu diffuse thuần túy cổ điển:

var material = new LambertMaterial("WoodMaterial");
material.Diffuse = new Vector4(0.6f, 0.4f, 0.2f, 1.0f);
material.Ambient = new Vector4(0.1f, 0.1f, 0.1f, 1.0f);
material.Transparency = 0.0f;

PhongMaterial

Mở rộng Lambert với các điểm sáng phản chiếu:

var material = new PhongMaterial("ShinyMetal");
material.Specular = new Vector4(0.8f, 0.8f, 0.8f, 1.0f);
material.Shininess = 50.0f;
material.SpecularPower = 32.0f;

PbrMaterial

Vật liệu render dựa trên vật lý được sử dụng bởi glTF 2.0:

var material = new PbrMaterial("GoldPBR");
material.BaseColor = new Vector4(1.0f, 0.8f, 0.2f, 1.0f);
material.Metallic = 0.9f;
material.Roughness = 0.1f;
material.Occlusion = 1.0f;

Các vật liệu PBR hỗ trợ các khe texture cho màu nền, metallic/roughness, normal, emissive và occlusion thông qua các thuộc tính đường dẫn texture dạng chuỗi.

Tiện ích Toán học

Thư viện cung cấp một tập hợp các primitive toán học cho các thao tác không gian 3D:

Các kiểu Vector

KiểuThành phầnĐộ chính xácCách dùng phổ biến
Vector2X, Yfloattọa độ texture UV
Vector3X, Y, ZfloatVector 3 thành phần đa mục đích
Vector4X, Y, Z, WfloatCác điểm điều khiển, pháp tuyến
FVector3X, Y, ZfloatThuộc tính biến đổi (Dịch chuyển, Thu phóng)
FVector4X, Y, Z, WfloatDữ liệu phần tử đỉnh

Quaternion

Quaternion đại diện cho các phép quay mà không gặp hiện tượng gimbal lock:

var rotation = new Quaternion(0, 0, 0, 1); // Identity
node.Transform.Rotation = rotation;

Matrix4

4x4 transformation matrices for composing transforms:

// Matrix operations are used internally by Transform
// and GlobalTransform for world-space computation

BoundingBox

Hộp bao căn trục cho các truy vấn không gian:

// BoundingBox stores Minimum and Maximum FVector3 corners
// Used for frustum culling and spatial partitioning

Các phần tử đỉnh

Lưới có thể chứa các lớp dữ liệu bổ sung cho mỗi đỉnh ngoài vị trí:

  • VertexElementNormal – các vector pháp tuyến bề mặt cho tính toán ánh sáng.
  • VertexElementUV – tọa độ texture để ánh xạ hình ảnh lên hình học.
  • VertexElementVertexColor – dữ liệu màu RGBA theo từng đỉnh.

Mỗi phần tử đỉnh có một MappingMode (theo điểm điều khiển, theo đỉnh đa giác, hoặc theo đa giác) và một ReferenceMode (giá trị trực tiếp hoặc giá trị được chỉ mục).

Clip hoạt hình

Lớp Scene lớp hỗ trợ các đoạn hoạt hình có tên thông qua CreateAnimationClip()GetAnimationClip(). Trong phiên bản FOSS hiện tại, việc tạo và tra cứu đoạn hoạt hình hoạt động, nhưng dữ liệu keyframe và phát lại chưa được triển khai.

var scene = new Scene();
var clip = scene.CreateAnimationClip("Walk");

// Retrieve by name
var found = scene.GetAnimationClip("Walk");
Console.WriteLine("Clip found: " + (found != null));

Tiếp theo

Bài viết tiếp theo sẽ đề cập đến làm việc với các định dạng tệp 3D trong .NET – một hướng dẫn thực tế, từng định dạng một cho OBJ, STL, glTF, FBX và 3MF với các tùy chọn tải/lưu và mẫu chuyển đổi hàng loạt.