Carregant models 3D
@aspose/3d proporciona dos mètodes de càrrega a la Scene classe: open() per a la càrrega per ruta de fitxer i openFromBuffer() per a dades en memòria. La detecció del format és automàtica a partir dels números màgics binaris o de l’extensió del fitxer, de manera que rarament cal especificar explícitament el format d’origen.
Càrrega des d’un camí de fitxer
Passa la cadena de ruta del fitxer a scene.open(). La biblioteca detecta el format a partir de l’extensió del fitxer i, per a formats binaris, a partir dels bytes màgics:
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() substitueix qualsevol contingut d’escena existent. Si necessites carregar diversos fitxers, crea Scene instàncies.
Càrrega d’OBJ amb materials
Els fitxers OBJ fan referència a materials a través d’un fitxer sidecar .mtl fitxer. La càrrega de materials és activada per defecte (ObjLoadOptions.enableMaterials = true). Passa ObjLoadOptions per controlar això i altres opcions de càrrega:
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}`);
}Càrrega des d’un buffer
Utilitza openFromBuffer() quan les dades del fitxer ja són a la memòria, per exemple d’una recuperació HTTP, d’un BLOB de base de dades o d’una extracció d’un arxiu zip. Això evita escriure al disc:
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`);Per a formats binaris (GLB, STL binary, 3MF), la biblioteca llegeix els bytes màgics del buffer per detectar el format automàticament, de manera que pots passar undefined com a argument d’opcions:
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
Càrrega des d’HTTP (Node.js 18+)
Obté un recurs remot i carrega’l sense tocar el sistema de fitxers:
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`);Inspecció de l’escena carregada
Després de carregar, recorre el gràfic d’escena per enumerar nodes i identificar geometria:
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);Lectura de metadades del recurs
El assetInfo propietat exposa metadades a nivell de fitxer:
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}`);
}No tots els formats omplen assetInfo. FBX i COLLADA tenen metadades riques; OBJ i STL típicament no en tenen.
Referència d’opcions de càrrega específiques del format
| Format | Classe d’opcions | Camí d’importació | Opcions clau |
|---|---|---|---|
| OBJ | ObjLoadOptions | @aspose/3d/formats/obj | enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
| glTF / GLB | (cap requerit) | N/A | Detectat automàticament; no cal classe d’opcions |
| STL | StlLoadOptions | @aspose/3d/formats/stl | (no hi ha opcions configurables a la versió actual) |
| FBX | FbxLoadOptions | @aspose/3d/formats/fbx | (no hi ha opcions configurables a la versió actual) |
| COLLADA | ColladaLoadOptions | @aspose/3d/formats/collada | (no hi ha opcions configurables a la versió actual) |
| 3MF | (cap requerit) | N/A | Detectat automàticament |
Errors de càrrega comuns
| Símptoma | Causa | Solució |
|---|---|---|
Error: Cannot find module '@aspose/3d/formats/obj' | moduleResolution no establert a node | Afegir "moduleResolution": "node" a tsconfig.json |
| Llista de nodes buida després de carregar OBJ | .mtl sidecar absent o enableMaterials no establert | Establir options.enableMaterials = true i assegura .mtl és al mateix directori |
L’escena es carrega però rootNode.childNodes està buida | El format utilitza una única malla arrel, no nodes fills | Accés scene.rootNode.entity directament |
openFromBuffer llança amb STL binari | El buffer es va tallar incorrectament (faltaven bytes finals) | Utilitza el complet readFileSync() sortida sense tallar |
| La matriu de clips d’animació està buida després de carregar l’FBX | El fitxer FBX utilitza transformacions precomputades, no clips | L’animació està precomputada per fotograma; la matriu de clips estarà buida |
Vegeu també
- Desar models 3D: opcions d’exportació i
saveToBuffer - Graf de l’escena: recórrer i modificar la jerarquia de nodes
- Visió general de l’API: totes les classes i enumeracions
- Compatibilitat de formats: matriu completa de lectura/escriptura