Cargando modelos 3D
@aspose/3d proporciona dos métodos de carga en el Scene clase: open() para carga mediante ruta de archivo y openFromBuffer() para datos en memoria. La detección de formato es automática a partir de los números mágicos binarios o la extensión del archivo, por lo que rara vez necesitas especificar el formato de origen explícitamente.
Cargando desde una ruta de archivo
Pasa la cadena de ruta de archivo a scene.open(). La biblioteca detecta el formato a partir de la extensión del archivo y, para formatos binarios, a partir de los bytes mágicos:
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() reemplaza cualquier contenido de escena existente. Si necesitas cargar varios archivos, crea Scene instancias.
Cargando OBJ con materiales
Los archivos OBJ hacen referencia a materiales a través de un archivo sidecar .mtl archivo. La carga de materiales está habilitada por defecto (ObjLoadOptions.enableMaterials = true). Pasar ObjLoadOptions para controlar esto y otras opciones de carga:
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}`);
}Cargando desde un búfer
Usar openFromBuffer() cuando los datos del archivo ya están en memoria, por ejemplo a partir de una obtención HTTP, un BLOB de base de datos o una extracción de un archivo zip. Esto evita escribir en disco:
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`);Para formatos binarios (GLB, STL binary, 3MF), la biblioteca lee los bytes mágicos del búfer para detectar el formato automáticamente, por lo que puedes pasar undefined como argumento de opciones:
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
Cargando desde HTTP (Node.js 18+)
Obtenga un recurso remoto y cárguelo sin tocar el sistema de archivos:
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`);Inspeccionando la escena cargada
Después de cargar, recorra el grafo de la escena para enumerar nodos e identificar geometría:
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);Leyendo metadatos del recurso
El assetInfo propiedad expone metadatos a nivel de archivo:
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 todos los formatos poblan assetInfo. FBX y COLLADA tienen metadatos ricos; OBJ y STL típicamente no los tienen.
Referencia de Opciones de Carga Específicas del Formato
| Formato | Clase de Opciones | Ruta de importación | Opciones clave |
|---|---|---|---|
| OBJ | ObjLoadOptions | @aspose/3d/formats/obj | enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
| glTF / GLB | (ninguno requerido) | N/A | Detectado automáticamente; no se necesita clase de opciones |
| STL | StlLoadOptions | @aspose/3d/formats/stl | (no hay opciones configurables en la versión actual) |
| FBX | FbxLoadOptions | @aspose/3d/formats/fbx | (no hay opciones configurables en la versión actual) |
| COLLADA | ColladaLoadOptions | @aspose/3d/formats/collada | (no hay opciones configurables en la versión actual) |
| 3MF | (ninguno requerido) | N/A | Detectado automáticamente |
Errores Comunes de Carga
| Síntoma | Causa | Solución |
|---|---|---|
Error: Cannot find module '@aspose/3d/formats/obj' | moduleResolution no está configurado a node | Agregar "moduleResolution": "node" a tsconfig.json |
| Lista de nodos vacía después de cargar OBJ | .mtl sidecar faltante o enableMaterials no está configurado | Establecer options.enableMaterials = true y asegúrese .mtl está en el mismo directorio |
La escena se carga pero rootNode.childNodes está vacía | El formato usa una malla raíz única, no nodos hijos | Acceso scene.rootNode.entity directamente |
openFromBuffer lanza una excepción con STL binario | El búfer se recortó incorrectamente (faltan bytes finales) | Usa el completo readFileSync() salida sin recortar |
| La matriz de clips de animación está vacía después de cargar el FBX | El archivo FBX utiliza transformaciones baked, no clips | La animación está baked por fotograma; la matriz de clips estará vacía |
Ver también
- Guardando modelos 3D: opciones de exportación y
saveToBuffer - Grafo de escena: recorrer y modificar la jerarquía de nodos
- Visión general de la API: todas las clases y enumeraciones
- Compatibilidad de formatos: matriz completa de lectura/escritura