Tải mô hình 3D
@aspose/3d cung cấp hai phương thức tải trên the Scene lớp: open() để tải bằng đường dẫn tệp và openFromBuffer() đối với dữ liệu trong bộ nhớ. Phát hiện định dạng được thực hiện tự động dựa trên số ma thuật nhị phân hoặc phần mở rộng tệp, vì vậy bạn hiếm khi cần chỉ định định dạng nguồn một cách rõ ràng.
Tải từ Đường dẫn Tệp
Truyền chuỗi đường dẫn tệp tới scene.open(). Thư viện phát hiện định dạng từ phần mở rộng tệp và, đối với các định dạng nhị phân, từ các byte ma thuật:
import { Scene } from '@aspose/3d';
const scene = new Scene();
scene.open('model.fbx');
console.log(`Root children: ${scene.rootNode.childNodes.length}`);
console.log(`Animation clips: ${scene.animationClips.length}`);open() thay thế mọi nội dung cảnh hiện có. Nếu bạn cần tải nhiều tệp, tạo các Scene đối tượng.
Tải OBJ kèm Vật liệu
Các tệp OBJ tham chiếu vật liệu thông qua một tệp phụ .mtl . Việc tải vật liệu được bật theo mặc định (ObjLoadOptions.enableMaterials = true). Truyền ObjLoadOptions để kiểm soát điều này và các tùy chọn tải khác:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true; // load the .mtl sidecar
options.flipCoordinateSystem = false; // keep original Y-up orientation
options.normalizeNormal = true; // fix degenerate normals
options.scale = 1.0; // unit scale multiplier
scene.open('character.obj', options);
// Inspect materials on the first node
const first = scene.rootNode.childNodes[0];
if (first) {
console.log(`Materials on ${first.name}: ${first.materials.length}`);
}Tải từ Bộ nhớ Đệm
Sử dụng openFromBuffer() khi dữ liệu tệp đã có trong bộ nhớ, ví dụ từ một yêu cầu HTTP, một BLOB trong cơ sở dữ liệu, hoặc việc giải nén từ một archive zip. Điều này tránh việc ghi ra đĩa:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import * as fs from 'fs';
const buffer: Buffer = fs.readFileSync('model.obj');
const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;
scene.openFromBuffer(buffer, options);
console.log(`Loaded ${scene.rootNode.childNodes.length} root nodes`);Đối với các định dạng nhị phân (GLB, STL binary, 3MF), thư viện đọc các byte ma thuật từ bộ đệm để tự động phát hiện định dạng, vì vậy bạn có thể truyền undefined như là đối số options:
import { Scene } from '@aspose/3d';
import * as fs from 'fs';
const glbBuffer: Buffer = fs.readFileSync('model.glb');
const scene = new Scene();
scene.openFromBuffer(glbBuffer); // format auto-detected from GLB magic bytes
Tải từ HTTP (Node.js 18+)
Lấy một tài sản từ xa và tải nó mà không cần chạm tới hệ thống tệp:
import { Scene } from '@aspose/3d';
async function loadFromUrl(url: string): Promise<Scene> {
const response = await fetch(url);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
const scene = new Scene();
scene.openFromBuffer(buffer);
return scene;
}
const scene = await loadFromUrl('https://example.com/model.glb');
console.log(`Loaded scene: ${scene.rootNode.childNodes.length} root nodes`);Kiểm tra Cảnh đã Tải
Sau khi tải, duyệt đồ thị cảnh để liệt kê các nút và xác định hình học:
import { Scene, Mesh, Node } from '@aspose/3d';
const scene = new Scene();
scene.open('model.fbx');
function inspect(node: Node, depth: number = 0): void {
const indent = ' '.repeat(depth);
const entityType = node.entity ? node.entity.constructor.name : '(none)';
console.log(`${indent}${node.name} [${entityType}]`);
if (node.entity instanceof Mesh) {
const mesh = node.entity as Mesh;
console.log(`${indent} vertices: ${mesh.controlPoints.length}, polygons: ${mesh.polygonCount}`);
}
for (const child of node.childNodes) {
inspect(child, depth + 1);
}
}
inspect(scene.rootNode);Đọc Siêu dữ liệu Tài sản
Cái assetInfo thuộc tính hiển thị siêu dữ liệu ở mức tệp:
import { Scene } from '@aspose/3d';
const scene = new Scene();
scene.open('model.fbx');
const info = scene.assetInfo;
if (info) {
console.log(`Creator: ${info.creator}`);
console.log(`Unit name: ${info.unitName}`);
console.log(`Unit scale: ${info.unitScaleFactor}`);
}Không phải tất cả các định dạng đều cung cấp assetInfo. FBX và COLLADA có siêu dữ liệu phong phú; OBJ và STL thường không có.
Tham chiếu các tùy chọn tải riêng cho định dạng
| Định dạng | Lớp Tùy chọn | Đường dẫn nhập | Các tùy chọn chính |
|---|---|---|---|
| OBJ | ObjLoadOptions | @aspose/3d/formats/obj | enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
| glTF / GLB | (không cần thiết) | N/A | Tự động phát hiện; không cần lớp tùy chọn |
| STL | StlLoadOptions | @aspose/3d/formats/stl | (không có tùy chọn có thể cấu hình trong phiên bản hiện tại) |
| FBX | FbxLoadOptions | @aspose/3d/formats/fbx | (không có tùy chọn có thể cấu hình trong phiên bản hiện tại) |
| COLLADA | ColladaLoadOptions | @aspose/3d/formats/collada | (không có tùy chọn có thể cấu hình trong phiên bản hiện tại) |
| 3MF | (không cần thiết) | N/A | Tự động phát hiện |
Các lỗi tải thường gặp
| Triệu chứng | Nguyên nhân | Cách khắc phục |
|---|---|---|
Error: Cannot find module '@aspose/3d/formats/obj' | moduleResolution không được đặt thành node | Thêm "moduleResolution": "node" đến tsconfig.json |
| Danh sách nút rỗng sau khi tải OBJ | .mtl thiếu sidecar hoặc enableMaterials chưa được đặt | Đặt options.enableMaterials = true và đảm bảo .mtl nằm trong cùng thư mục |
Cảnh được tải nhưng rootNode.childNodes rỗng | Định dạng sử dụng một mesh gốc duy nhất, không phải các nút con | Truy cập scene.rootNode.entity trực tiếp |
openFromBuffer ném ngoại lệ với binary STL | Buffer đã bị cắt không đúng (thiếu byte cuối) | Sử dụng toàn bộ readFileSync() đầu ra mà không cắt |
| Mảng clip hoạt hình trống sau khi tải FBX | Tệp FBX sử dụng baked transforms, không phải clip | Hoạt ảnh được bake theo khung; mảng clip sẽ trống |
Xem Thêm
- Lưu mô hình 3D: các tùy chọn xuất và
saveToBuffer - Đồ thị Cảnh: duyệt và sửa đổi cây nút
- Tổng quan API: tất cả các lớp và liệt kê
- Hỗ trợ định dạng: ma trận đọc/ghi đầy đủ