Các nhà phát triển Node.js làm việc với nội dung 3D thường cần chuyển đổi giữa các định dạng: công cụ thiết kế xuất OBJ, trình render web yêu cầu GLB, máy in 3D cần STL, và quy trình sản xuất sử dụng 3MF. Việc xử lý các chuyển đổi này bằng một API duy nhất, nhất quán giúp giảm số lượng công cụ bên ngoài trong quy trình và giữ logic chuyển đổi trong mã ứng dụng, nơi có thể kiểm thử và quản lý phiên bản.

Cái @aspose/3d gói (v24.12.0, giấy phép MIT) cung cấp một API ưu tiên TypeScript để đọc và ghi tất cả các định dạng 3D chính trong Node.js. Hướng dẫn này sẽ đi qua các quy trình chuyển đổi phổ biến nhất.

Cài đặt

npm install @aspose/3d

Yêu cầu: Node.js 18, 20 hoặc 22; TypeScript 5.0 trở lên. Phụ thuộc thời gian chạy duy nhất là xmldom.

Các định dạng được hỗ trợ

Bảng dưới đây liệt kê các định dạng được đề cập trong hướng dẫn này và hỗ trợ đọc/ghi của chúng.

Định dạngPhần mở rộngĐọcGhiGhi chú
Wavefront OBJ.objKhôngChỉ nhập; đọc .mtl tệp vật liệu
glTF 2.0 (JSON).gltfĐịnh dạng giao hàng web chuẩn
glTF 2.0 (Nhị phân).glbTự chứa, ưu tiên cho web
STL (ASCII/Binary).stlĐịnh dạng in 3D tiêu chuẩn
3MF.3mfĐịnh dạng sản xuất với siêu dữ liệu phong phú
FBX.fbxKhông*Không*Trình nhập/xuất tồn tại nhưng việc tự động phát hiện định dạng chưa được kết nối; không thể sử dụng qua scene.open()
COLLADA.daeĐịnh dạng trao đổi dựa trên XML

Lưu ý: OBJ chỉ hỗ trợ nhập (canExport: false). Để chuyển đổi nội dung OBJ sang định dạng khác, tải nó bằng scene.open() và lưu sang định dạng xuất được hỗ trợ như glTF, STL, hoặc 3MF.

OBJ sang GLB (Phân phối Web)

Chuyển đổi OBJ sang glTF nhị phân (GLB) là quy trình web phổ biến nhất. GLB là một gói nhị phân tự chứa: kết cấu, hình học và siêu dữ liệu trong một tệp duy nhất, giúp hiệu quả cho việc truyền tải HTTP và tải trực tiếp bởi Three.js, Babylon.js và model-viewer.

import { Scene } from '@aspose/3d';

function convertObjToGlb(inputPath: string, outputPath: string): void {
  const scene = new Scene();
  scene.open(inputPath);
  scene.save(outputPath);  // extension '.glb' selects binary GLB format
  console.log(`Converted ${inputPath} -> ${outputPath}`);
}

convertObjToGlb('model.obj', 'model.glb');

Định dạng đầu ra được suy ra từ phần mở rộng tệp. Sử dụng .glb để tạo GLB nhị phân hoặc .gltf cho JSON riêng + .bin bố cục.

OBJ sang STL: Chuẩn bị mô hình cho in 3D

STL là ngôn ngữ chung của in 3D FDM và SLA. Các phần mềm cắt lớp như PrusaSlicer, Bambu Studio và Chitubox đều chấp nhận STL. Chuyển đổi từ OBJ sang STL rất đơn giản vì cả hai định dạng đều lưu trữ lưới tam giác.

import { Scene } from '@aspose/3d';

function convertObjToStl(inputPath: string, outputPath: string): void {
  const scene = new Scene();
  scene.open(inputPath);
  scene.save(outputPath);  // extension '.stl' selects STL format
  console.log(`STL written to ${outputPath}`);
}

convertObjToStl('part.obj', 'part.stl');

STL không lưu trữ màu sắc, vật liệu hoặc dữ liệu UV. Nếu tệp OBJ của bạn sử dụng các nhóm vật liệu, thông tin đó sẽ bị loại bỏ khi xuất. Đối với các định dạng in giữ màu, hãy cân nhắc sử dụng 3MF thay thế (xem bên dưới).

STL sang glTF: Từ đầu ra của máy quét hoặc CAD tới Web

Các máy quét ánh sáng cấu trúc và các công cụ xuất CAD tham số thường xuất ra STL. Chuyển đổi sang glTF giúp hình học có thể truy cập trong các trình xem dựa trên web và nền tảng AR mà không cần bước render phía máy chủ.

import { Scene } from '@aspose/3d';

function convertStlToGltf(inputPath: string, outputPath: string): void {
  const scene = new Scene();
  scene.open(inputPath);
  // extension '.gltf' saves as JSON + .bin sidecar
  scene.save(outputPath);
  console.log(`glTF written to ${outputPath}`);
}

convertStlToGltf('scan_output.stl', 'scan_output.gltf');

Vì STL không chứa thông tin vật liệu hay kết cấu, tệp glTF kết quả sẽ chỉ chứa hình học. Bạn có thể gắn vật liệu một cách lập trình vào các nút cảnh sau khi tải nếu cần.

3MF to glTF (Manufacturing to Visualization)

Định dạng Sản xuất 3D (3MF) ngày càng được sử dụng trong quy trình sản xuất gia tăng vì nó lưu trữ màu sắc, vật liệu, cây thành phần và siêu dữ liệu in cùng với hình học. Chuyển đổi 3MF sang glTF cho phép trực quan hoá trong các công cụ web đồng thời bảo tồn cấu trúc cảnh.

import { Scene } from '@aspose/3d';

function convert3mfToGlb(inputPath: string, outputPath: string): void {
  const scene = new Scene();
  scene.open(inputPath);
  scene.save(outputPath);  // extension '.glb' selects binary GLB format
  console.log(`3MF -> GLB: ${outputPath}`);
}

convert3mfToGlb('assembly.3mf', 'assembly.glb');

3MF files often contain multi-component assemblies. The scene graph produced by scene.open() giữ nguyên cấu trúc thành phần trong scene.rootNode.childNodes, vì vậy bạn có thể kiểm tra hoặc thao tác các phần riêng lẻ trước khi lưu.

Mẫu Chuyển Đổi Hàng Loạt

Khi xử lý một thư mục các tệp, bao bọc mỗi chuyển đổi trong một try/catch để một tệp hỏng duy nhất không làm dừng toàn bộ lô.

import { Scene } from '@aspose/3d';
import { readdirSync } from 'fs';
import { join, basename, extname } from 'path';

interface ConversionResult {
  input: string;
  output: string;
  success: boolean;
  error?: string;
}

function batchConvertToGlb(
  inputDir: string,
  outputDir: string,
  extensions: string[] = ['.obj', '.stl', '.3mf', '.dae']  // .fbx excluded: format auto-detection not wired
): ConversionResult[] {
  const results: ConversionResult[] = [];

  const files = readdirSync(inputDir).filter((f) =>
    extensions.includes(extname(f).toLowerCase())
  );

  for (const file of files) {
    const inputPath = join(inputDir, file);
    const outputPath = join(outputDir, basename(file, extname(file)) + '.glb');

    try {
      const scene = new Scene();
      scene.open(inputPath);
      scene.save(outputPath);  // extension '.glb' infers GLB format
      results.push({ input: inputPath, output: outputPath, success: true });
    } catch (err) {
      const message = err instanceof Error ? err.message : String(err);
      results.push({ input: inputPath, output: outputPath, success: false, error: message });
      console.error(`Failed to convert ${file}: ${message}`);
    }
  }

  const succeeded = results.filter((r) => r.success).length;
  console.log(`Batch complete: ${succeeded}/${results.length} files converted.`);
  return results;
}

// Usage
batchConvertToGlb('./input', './output');

Mẫu trên đọc mỗi phần mở rộng tệp được hỗ trợ từ một thư mục đầu vào, chuyển đổi sang GLB, và ghi lại bất kỳ lỗi nào mà không dừng vòng lặp. Mảng trả về của ConversionResult các đối tượng có thể được sử dụng cho việc báo cáo hoặc logic thử lại.

Kết luận

@aspose/3d bao phủ toàn bộ nhu cầu chuyển đổi định dạng trong một ứng dụng Node.js TypeScript với API hai bước nhất quán: scene.open() để tải, scene.save() để ghi. Ràng buộc chính cần nhớ là các lớp nhập và xuất FBX tồn tại nhưng việc tự động phát hiện định dạng chưa được kết nối, vì vậy các tệp FBX không thể được tải qua scene.open().

Để biết thêm chi tiết về Scene, Node, và Mesh các lớp được sử dụng trong các ví dụ này, xem các trang tham chiếu lớp trong tài liệu này.