Učitavanje 3D modela

@aspose/3d pruža dva načina učitavanja na Scene klasu: open() za učitavanje putem putanje do fajla i openFromBuffer() za podatke u memoriji. Detekcija formata je automatska na osnovu binarnih magičnih brojeva ili ekstenzije fajla, tako da retko morate eksplicitno navesti format izvora.

Učitavanje iz putanje do fajla

Prosledite string putanje fajla funkciji scene.open(). Biblioteka detektuje format iz ekstenzije fajla i, za binarne formate, iz magičnih bajtova:

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() zamenjuje sav postojeći sadržaj scene. Ako treba da učitate više fajlova, kreirajte odvojene Scene instance.

Učitavanje OBJ-a sa materijalima

OBJ fajlovi referišu materijale kroz sidecar fajl. Učitavanje materijala je .mtl omogućeno podrazumevano ) (ObjLoadOptions.enableMaterials = trueProsledite ObjLoadOptions da biste kontrolisali ovo i druge opcije pri učitavanju:

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}`);
}

Učitavanje iz bafera

Koristite openFromBuffer() kada su podaci fajla već u memoriji, na primer iz HTTP zahteva, BLOB‑a u bazi podataka ili ekstrakcije iz zip arhive. Ovo izbegava upis na disk:

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`);

Za binarne formate (GLB, STL binary, 3MF), biblioteka čita magične bajtove iz bafera kako bi automatski otkrila format, tako da možete proslediti undefined kao argument opcija:

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

Učitavanje iz HTTP-a (Node.js 18+)

Preuzmite udaljeni resurs i učitajte ga bez pristupa fajl sistemu:

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`);

Pregled učitane scene

Nakon učitavanja, prođite kroz graf scene da izlistate čvorove i identifikujete geometriju:

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);

Čitanje metapodataka resursa

The assetInfo svojstvo izlaže metapodatke na nivou fajla:

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}`);
}

Nisu svi formati popunjeni assetInfo. FBX i COLLADA imaju bogate metapodatke; OBJ i STL obično ih nemaju.

Referenca za specifične opcije učitavanja formata

FormatKlasa OpcijaPut uvozaKljučne opcije
OBJObjLoadOptions@aspose/3d/formats/objenableMaterials, flipCoordinateSystem, scale, normalizeNormal
glTF / GLB(nije potrebno)N/AAutomatski otkriveno; nije potrebna klasa opcija
STLStlLoadOptions@aspose/3d/formats/stl(nema konfigurabilnih opcija u trenutnoj verziji)
FBXFbxLoadOptions@aspose/3d/formats/fbx(nema konfigurabilnih opcija u trenutnoj verziji)
COLLADAColladaLoadOptions@aspose/3d/formats/collada(nema konfigurabilnih opcija u trenutnoj verziji)
3MF(nije potrebno)N/AAutomatski otkriveno

Uobičajene greške pri učitavanju

SimptomUzrokRešenje
Error: Cannot find module '@aspose/3d/formats/obj'moduleResolution nije postavljeno na nodeDodaj "moduleResolution": "node" na tsconfig.json
Prazna lista čvorova nakon učitavanja OBJ.mtl nedostaje sidecar ili enableMaterials nije postavljenoPostavi options.enableMaterials = true i osiguraj .mtl je u istom direktorijumu
Scena se učitava, ali rootNode.childNodes je praznaFormat koristi jedan korenski mesh, a ne podređene čvorovePristup scene.rootNode.entity direktno
openFromBuffer baci grešku sa binary STLBuffer je isečen nepravilno (nedostaju završni bajtovi)Koristite pun readFileSync() output bez sečenja
Animation clips array je prazan nakon FBX učitavanjaFBX file koristi baked transforms, a ne clipsAnimacija se obrađuje po frejmu; niz klipova će biti prazan

Vidi takođe

 Српски