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

FormatKelas PilihanLaluan ImportPilihan Utama
OBJObjLoadOptions@aspose/3d/formats/objenableMaterials, flipCoordinateSystem, scale, normalizeNormal
glTF / GLB(tiada diperlukan)N/ADikesan secara automatik; tiada kelas pilihan diperlukan
STLStlLoadOptions@aspose/3d/formats/stl(tiada pilihan boleh dikonfigurasi dalam versi semasa)
FBXFbxLoadOptions@aspose/3d/formats/fbx(tiada pilihan boleh dikonfigurasi dalam versi semasa)
COLLADAColladaLoadOptions@aspose/3d/formats/collada(tiada pilihan boleh dikonfigurasi dalam versi semasa)
3MF(tiada diperlukan)N/ADikesan secara automatik

Ralat Pemuatan Biasa

GejalaPuncaPenyelesaian
Error: Cannot find module '@aspose/3d/formats/obj'moduleResolution tidak ditetapkan kepada nodeTambah "moduleResolution": "node" ke tsconfig.json
Senarai nod kosong selepas memuat OBJ.mtl sidecar tiada atau enableMaterials tidak ditetapkanTetapkan options.enableMaterials = true dan pastikan .mtl berada dalam direktori yang sama
Adegan dimuat tetapi rootNode.childNodes kosongFormat menggunakan satu mesh akar, bukan nod anakAkses scene.rootNode.entity secara langsung
openFromBuffer menghasilkan ralat dengan STL binariPenimbal dipotong secara tidak betul (bait akhir hilang)Gunakan output penuh readFileSync() tanpa pemotongan
Array klip animasi kosong selepas memuat FBXFail FBX menggunakan transformasi terpasang, bukan klipAnimasi dipanggang per bingkai; array klip akan kosong

Lihat Juga

 Bahasa Melayu