Memuatkan Model 3D
@aspose/3d menyediakan dua kaedah pemuatan pada kelas Scene: open() untuk pemuatan laluan fail dan openFromBuffer() untuk data dalam memori. Pengesanan format adalah automatik daripada nombor sihir binari atau sambungan fail, jadi anda jarang perlu menyatakan format sumber secara eksplisit.
Memuat dari Laluan Fail
Hantar rentetan laluan fail kepada scene.open(). Perpustakaan mengesan format daripada sambungan fail dan, untuk format binari, daripada bait sihir:
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() menggantikan sebarang kandungan adegan yang sedia ada. Jika anda perlu memuatkan berbilang fail, cipta contoh Scene yang berasingan.
Memuat OBJ dengan Bahan
Fail OBJ merujuk bahan melalui fail sidecar .mtl. Pemuatan bahan diaktifkan secara lalai (ObjLoadOptions.enableMaterials = true). Hantar ObjLoadOptions untuk mengawal ini dan pilihan masa muat lain:
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}`);
}Memuat dari Penampan
Gunakan openFromBuffer() apabila data fail sudah berada dalam memori, contohnya daripada penarikan HTTP, BLOB pangkalan data, atau pengekstrakan arkib zip. Ini mengelakkan penulisan ke cakera:
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`);Untuk format binari (GLB, STL binari, 3MF), perpustakaan membaca bait sihir dari penimbal untuk mengesan format secara automatik, jadi anda boleh menghantar undefined sebagai argumen pilihan:
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
Memuat dari HTTP (Node.js 18+)
Ambil aset jauh dan muatkan tanpa menyentuh sistem fail:
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`);Memeriksa Adegan yang Dimuat
Selepas memuatkan, lalui graf adegan untuk menyenaraikan nod dan mengenal pasti geometri:
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);Membaca Metadata Aset
Sifat assetInfo memaparkan metadata pada peringkat fail:
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}`);
}Tidak semua format mengisi assetInfo. FBX dan COLLADA mempunyai metadata yang kaya; OBJ dan STL biasanya tidak.
Rujukan Pilihan Muat Mengikut Format
| Format | Kelas Pilihan | Laluan Import | Pilihan Utama |
|---|---|---|---|
| OBJ | ObjLoadOptions | @aspose/3d/formats/obj | enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
| glTF / GLB | (tiada diperlukan) | N/A | Dikesan secara automatik; tiada kelas pilihan diperlukan |
| STL | StlLoadOptions | @aspose/3d/formats/stl | (tiada pilihan boleh dikonfigurasi dalam versi semasa) |
| FBX | FbxLoadOptions | @aspose/3d/formats/fbx | (tiada pilihan boleh dikonfigurasi dalam versi semasa) |
| COLLADA | ColladaLoadOptions | @aspose/3d/formats/collada | (tiada pilihan boleh dikonfigurasi dalam versi semasa) |
| 3MF | (tiada diperlukan) | N/A | Dikesan secara automatik |
Ralat Pemuatan Biasa
| Gejala | Punca | Penyelesaian |
|---|---|---|
Error: Cannot find module '@aspose/3d/formats/obj' | moduleResolution tidak ditetapkan kepada node | Tambah "moduleResolution": "node" ke tsconfig.json |
| Senarai nod kosong selepas memuat OBJ | .mtl sidecar tiada atau enableMaterials tidak ditetapkan | Tetapkan options.enableMaterials = true dan pastikan .mtl berada dalam direktori yang sama |
Adegan dimuat tetapi rootNode.childNodes kosong | Format menggunakan satu mesh akar, bukan nod anak | Akses scene.rootNode.entity secara langsung |
openFromBuffer menghasilkan ralat dengan STL binari | Penimbal dipotong secara tidak betul (bait akhir hilang) | Gunakan output penuh readFileSync() tanpa pemotongan |
| Array klip animasi kosong selepas memuat FBX | Fail FBX menggunakan transformasi terpasang, bukan klip | Animasi dipanggang per bingkai; array klip akan kosong |
Lihat Juga
- Menyimpan Model 3D: pilihan eksport dan
saveToBuffer - Graf Adegan: menelusuri dan mengubah hierarki nod
- Gambaran Keseluruhan API: semua kelas dan enumerasi
- Sokongan Format: matriks baca/tulis lengkap