Učitavanje 3D modela
@aspose/3d pruža dva načina učitavanja na Scene klasu: open() za učitavanje putem putanje datoteke i openFromBuffer() za podatke u memoriji. Otkrivanje formata je automatsko na temelju binarnih magičnih brojeva ili ekstenzije datoteke, pa rijetko morate izričito navesti izvorni format.
Učitavanje iz putanje do datoteke
Proslijedite niz putanje datoteke u scene.open(). Biblioteka otkriva format iz ekstenzije datoteke 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() zamjenjuje sav postojeći sadržaj scene. Ako trebate učitati više datoteka, stvorite zasebne Scene instance.
Učitavanje OBJ-a s materijalima
OBJ datoteke referenciraju materijale putem pomoćne .mtl datoteke. Učitavanje materijala je omogućeno prema zadanim postavkama (ObjLoadOptions.enableMaterials = true). Proslijedite ObjLoadOptions za kontrolu ovoga i drugih opcija 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 datoteke već u memoriji, na primjer iz HTTP zahtjeva, BLOB‑a baze podataka ili ekstrakcije zip arhive. Ovo izbjegava pisanje 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 međuspremnika kako bi automatski otkrila format, pa možete proslijediti 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 datotečnom sustavu:
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 kako biste nabrojali čvorove i identificirali 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 otkriva metapodatke na razini datoteke:
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 popunjavaju assetInfo. FBX i COLLADA imaju bogate metapodatke; OBJ i STL ih obično nemaju.
Referenca za opcije učitavanja specifične za format
| Format | Klasa opcija | Put uvoza | Ključne opcije |
|---|---|---|---|
| OBJ | ObjLoadOptions | @aspose/3d/formats/obj | enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
| glTF / GLB | (ništa nije potrebno) | N/A | Automatski otkriveno; nije potrebna klasa opcija |
| STL | StlLoadOptions | @aspose/3d/formats/stl | (nema konfigurabilnih opcija u trenutnoj verziji) |
| FBX | FbxLoadOptions | @aspose/3d/formats/fbx | (nema konfigurabilnih opcija u trenutnoj verziji) |
| COLLADA | ColladaLoadOptions | @aspose/3d/formats/collada | (nema konfigurabilnih opcija u trenutnoj verziji) |
| 3MF | (ništa nije potrebno) | N/A | Automatski otkriveno |
Uobičajene greške pri učitavanju
| Simptom | Uzrok | Rješenje |
|---|---|---|
Error: Cannot find module '@aspose/3d/formats/obj' | moduleResolution nije postavljeno na node | Dodaj "moduleResolution": "node" u tsconfig.json |
| Prazna lista čvorova nakon učitavanja OBJ | .mtl nedostaje sidecar ili enableMaterials nije postavljeno | Postavi options.enableMaterials = true i osiguraj .mtl je u istom direktoriju |
Scena se učitava, ali rootNode.childNodes je prazna | Format koristi jedan korijenski mesh, a ne podčvorove | Pristup scene.rootNode.entity izravno |
openFromBuffer baca iznimku s binarnim STL-om | Bafer je nepravilno izrezan (nedostaju završni bajtovi) | Koristi cijeli readFileSync() izlaz bez izrezivanja |
| Niz animacijskih isječaka je prazan nakon učitavanja FBX-a | FBX datoteka koristi pečene transformacije, a ne isječke | Animacija se izračunava po okviru; niz isječaka bit će prazan |
Vidi također
- Spremanje 3D modela: opcije izvoza i
saveToBuffer - Graf scene: prolazak i izmjena hijerarhije čvorova
- Pregled API-ja: sve klase i enumeracije
- Podrška za formate: potpuna matrica čitanja/pisanja