Trong bài viết giới thiệu, chúng tôi đã đề cập đến Aspose.3D FOSS cho Java 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 lĩnh vực.

Tất cả các ví dụ giả định import sau:

import com.aspose.threed.*;

Và phụ thuộc Maven:

<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-3d-foss</artifactId>
    <version>26.1.0</version>
</dependency>

API Đồ thị Cảnh

Đồ thị cảnh là nền tảng của Aspose.3D FOSS cho Java. Mỗi mô hình 3D – dù được tải từ tệp hay được xây dựng bằng chương trình – được biểu diễn dưới dạng cây các nút có gốc tại một Scene đối tượng.

Scene

Lớp Scene là điểm vào cho mọi thao tác. Bạn có thể tạo một cảnh trống hoặc tải một cảnh từ tệp:

// Empty scene
Scene scene = new Scene();

// Load from file
Scene loaded = Scene.fromFile("model.obj");

// Load with explicit options
Scene fromStl = Scene.fromFile("part.stl", new StlLoadOptions());

Gốc của cây nút được truy cập qua getRootNode().

Node

Một Node đại diện cho một vị trí có tên trong cây cảnh. Các nút có thể có con, tạo thành một hệ thống phân cấp. Mỗi nút mang một Transform và một GlobalTransform.

Scene scene = new Scene();

// Create a child node under the root
Node box = scene.getRootNode().createChildNode("Box");

// Create a nested hierarchy
Node arm = scene.getRootNode().createChildNode("Arm");
Node hand = arm.createChildNode("Hand");
Node finger = hand.createChildNode("Finger");

Bạn cũng có thể tạo các node một cách độc lập và gắn chúng sau này:

Node standalone = new Node("Standalone");
scene.getRootNode().getChildNodes().add(standalone);

Entity và Mesh

Một Entity là một lớp cơ sở trừu tượng cho bất kỳ thứ gì có thể được gắn vào một nút – hình học, máy ảnh và đèn. Kiểu thực thể phổ biến nhất là Mesh, chứa hình học đa giác (đỉnh, mặt và pháp tuyến).

Scene scene = Scene.fromFile("cube.obj");

// Traverse nodes and inspect entities
for (Node child : scene.getRootNode().getChildNodes()) {
    Entity entity = child.getEntity();
    if (entity instanceof Mesh) {
        Mesh mesh = (Mesh) entity;
        System.out.println("Node: " + child.getName());
        System.out.println("  Vertices: " + mesh.getControlPoints().size());
    }
}

Camera

Camera là các entity được gắn vào các node:

Scene scene = new Scene();

Node cameraNode = scene.getRootNode().createChildNode("MainCamera");
// Camera entity can be assigned to the node

Định nghĩa camera được giữ nguyên khi xuất sang các định dạng hỗ trợ chúng (như glTF).

Lưu ý: Cái Light class không khả dụng trong phiên bản Java. Dữ liệu chiếu sáng cảnh từ các tệp được nhập được lưu trữ dưới dạng generic Entity objects.

Tải và Lưu Không Phụ Thuộc Định Dạng

Một trong những điểm mạnh của thư viện là đồ thị cảnh không phụ thuộc vào định dạng. Bạn có thể tải từ bất kỳ định dạng nào được hỗ trợ, thao tác với cảnh qua một API duy nhất, và lưu ra bất kỳ định dạng nào được hỗ trợ.

// Load OBJ, save as glTF
Scene scene = Scene.fromFile("input.obj");
scene.save("output.gltf");

// Load FBX, save as STL (FBX is import only)
Scene scene2 = Scene.fromFile("character.fbx");
scene2.save("character.stl");

// Load STL, save as GLB
Scene scene3 = Scene.fromFile("part.stl", new StlLoadOptions());
GltfSaveOptions opts = new GltfSaveOptions();
opts.setContentType(FileContentType.BINARY);
scene3.save("part.glb", opts);

Định dạng được xác định bởi phần mở rộng tệp. Bạn cũng có thể truyền các tùy chọn lưu cụ thể để kiểm soát đầu ra:

GltfSaveOptions opts = new GltfSaveOptions();
opts.setFlipCoordinateSystem(true);
opts.setPrettyPrint(true);

scene.save("output.gltf", opts);

Vật liệu

Aspose.3D FOSS cho Java cung cấp mô hình vật liệu PBR (Physically Based Rendering) thông qua PbrMaterial. Đây là class vật liệu cụ thể duy nhất trong phiên bản Java.

PbrMaterial

Một vật liệu render dựa trên vật lý sử dụng các tham số albedo, metalness và roughness. Đây là mô hình vật liệu tiêu chuẩn cho glTF và các engine thời gian thực hiện đại.

PbrMaterial pbr = new PbrMaterial();
pbr.setAlbedo(new Vector4(0.8, 0.2, 0.2, 1.0)); // Red-ish base color
pbr.setMetallicFactor(0.0);  // Non-metallic
pbr.setRoughnessFactor(0.5); // Medium roughness

Việc bảo tồn vật liệu giữa các định dạng phụ thuộc vào khả năng của định dạng đích. Các vật liệu PBR tự nhiên được ánh xạ sang đầu ra glTF và GLB.

Biến đổi và Không gian

Mỗi Node trong đồ thị cảnh có một Transform định nghĩa vị trí, góc quay và tỉ lệ của nó so với nút cha.

Biến đổi Cục bộ

Scene scene = new Scene();
Node node = scene.getRootNode().createChildNode("TestNode");

Transform t = node.getTransform();
t.setTranslation(1, 2, 3);       // Position
t.setScale(2, 2, 2);             // Uniform scale
t.setEulerAngles(0, 45, 0);      // Euler rotation in degrees

Biến đổi Toàn cục

Cái GlobalTransform là phép biến đổi không gian thế giới đã được tính toán, tính đến toàn bộ chuỗi cha mẹ. Điều này chỉ đọc và tự động cập nhật.

Node parent = scene.getRootNode().createChildNode("Parent");
parent.getTransform().setTranslation(10, 0, 0);

Node child = parent.createChildNode("Child");
child.getTransform().setTranslation(5, 0, 0);

// Child's global position is (15, 0, 0)
GlobalTransform global = child.getGlobalTransform();

Quá trình kế thừa biến đổi cha-con này tuân theo mẫu đồ thị cảnh tiêu chuẩn được các engine 3D và công cụ DCC sử dụng.

Tiện ích Toán học

Thư viện bao gồm các kiểu toán học cốt lõi cho các thao tác 3D.

Vector3

Một vector ba thành phần được sử dụng cho vị trí, hướng, pháp tuyến và màu sắc.

Vector3 a = new Vector3(1, 0, 0);
Vector3 b = new Vector3(0, 1, 0);

// Addition
Vector3 sum = Vector3.add(a, b); // (1, 1, 0)

Matrix4

Một ma trận biến đổi 4x4 để kết hợp dịch chuyển, quay và tỉ lệ thành một thao tác duy nhất.

Matrix4 mat = new Matrix4();
// Matrix4 is used internally by transforms
// and can be retrieved from GlobalTransform

Quaternion

Một biểu diễn quay tránh gimbal lock và nội suy mượt mà. Quaternion được sử dụng nội bộ bởi hệ thống biến đổi.

BoundingBox

Một bounding box thẳng hàng trục dùng cho các truy vấn không gian, kiểm tra va chạm và phân tích cảnh.

BoundingBox bbox = new BoundingBox();
// BoundingBox can be computed from mesh geometry

Các hạn chế đã biết

Cần lưu ý rằng Scene.render()không được hỗ trợ trong phiên bản FOSS. Gọi nó sẽ ném ra một UnsupportedOperationException. Thư viện được thiết kế cho việc xử lý 3D dựa trên tệp – tải, biến đổi và lưu – thay vì render thời gian thực.

Tóm tắt

Các tính năng chính của Aspose.3D FOSS cho Java được chia thành năm lĩnh vực:

Khu vựcLớpMục đích
Đồ thị CảnhScene, Node, Entity, Mesh, CameraBiểu diễn mô hình phân cấp
Định dạngTùy chọn Tải/Lưu cho OBJ, STL, glTF/GLB; Tải cho FBXI/O không phụ thuộc vào định dạng
Vật liệuPbrMaterialHiển thị bề mặt (PBR)
Biến đổiTransform, GlobalTransformVị trí không gian
ToánVector3, Matrix4, Quaternion, BoundingBox3D math primitives

Trong bài viết tiếp theo, chúng tôi sẽ hướng dẫn chi tiết các tutorial thực tế theo từng định dạng, bao gồm OBJ, STL, glTF và FBX với các tùy chọn tải và lưu chi tiết.