Com carregar models 3D a TypeScript
El @aspose/3d El paquet ofereix a les aplicacions TypeScript i Node.js una API senzilla per obrir fitxers d’escenes 3D. Scene és l’objecte arrel: crida scene.open() amb una ruta de fitxer i opcions de càrrega específiques del format, després recorre scene.rootNode per accedir a la geometria, els materials i les transformacions.
Guia pas a pas
Pas 1: Instal·leu @aspose/3d via npm
Afegiu el paquet al vostre projecte. No es necessiten binaris natius ni eines de compilació específiques de la plataforma; només Node.js 18 o superior.
npm install @aspose/3dPer a projectes TypeScript, les definicions de tipus venen incloses amb el paquet:
##tsconfig.json: minimum required settings
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true
}
}Pas 2: Importeu Scene i les opcions específiques del format
Cada format exposa la seva pròpia classe carregadora i l’objecte d’opcions sota un subcamí. Importeu només el que necessiteu:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Per a altres formats el patró és idèntic:
import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';Pas 3: Obriu un fitxer 3D utilitzant scene.open()
Crea un Scene instància, després crida scene.open() amb la ruta del fitxer i un objecte d’opcions de càrrega opcional. La crida és síncrona.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;
scene.open('model.obj', options);
console.log('Scene loaded successfully');Per carregar des d’un Buffer ja a la memòria (útil en contextos sense servidor o de transmissió):
import * as fs from 'fs';
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const buffer = fs.readFileSync('model.obj');
const scene = new Scene();
scene.openFromBuffer(buffer, new ObjLoadOptions());Pas 4: Itereu sobre els nodes de l’escena
El gràfic d’escena és un arbre arrelat a scene.rootNode. Cada Node pot contenir nodes fills i una opcional entity (malla, càmera, llum, etc.).
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
function visitNode(node: any, depth: number = 0): void {
const indent = ' '.repeat(depth);
console.log(`${indent}Node: ${node.name}`);
if (node.entity) {
console.log(`${indent} Entity type: ${node.entity.constructor.name}`);
}
for (const child of node.childNodes) {
visitNode(child, depth + 1);
}
}
visitNode(scene.rootNode);Pas 5: Accediu a les dades de vèrtex de la malla mitjançant controlPoints
Quan l’entitat d’un node és una Mesh, pots llegir els punts de control en brut (vèrtexs) des del controlPoints matriu. Cada entrada és una Vector4 amb x, y, z, i w components.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
for (const node of scene.rootNode.childNodes) {
if (!node.entity) continue;
const entity = node.entity;
// Check if the entity is a Mesh by duck-typing controlPoints
if ('controlPoints' in entity) {
const mesh = entity as any;
console.log(`Mesh "${node.name}": ${mesh.controlPoints.length} vertices`);
// Print first three vertices
for (let i = 0; i < Math.min(3, mesh.controlPoints.length); i++) {
const v = mesh.controlPoints[i];
console.log(` v[${i}]: x=${v.x.toFixed(4)}, y=${v.y.toFixed(4)}, z=${v.z.toFixed(4)}`);
}
}
}Pas 6: Configureu ObjLoadOptions per a la càrrega de materials
ObjLoadOptions exposa propietats per controlar com els .mtl fitxers de material i textures es resolen.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const options = new ObjLoadOptions();
options.enableMaterials = true; // parse .mtl file if present
const scene = new Scene();
scene.open('model.obj', options);
// Inspect materials attached to nodes
for (const node of scene.rootNode.childNodes) {
if (node.material) {
console.log(`Material on "${node.name}": ${node.material.constructor.name}`);
}
}Problemes comuns i solucions
Error: No es pot trobar el mòdul ‘@aspose/3d/formats/obj’ Els subcamins de format requereixen exportacions de paquets de Node.js 12.7+. Assegureu-vos que esteu a Node.js 18 o posterior. Si utilitzeu TypeScript, establiu "moduleResolution": "node16" o "bundler" a tsconfig.json.
scene.rootNode.childNodes està buit després d’open() Alguns fitxers OBJ utilitzen salts de línia no estàndard o no tenen una nova línia final. Verifiqueu que el fitxer sigui un OBJ vàlid obrint-lo en un editor de text. També confirmeu que heu passat ObjLoadOptions i no un genèric LoadOptions: les opcions específiques del format són necessàries per a una tramesa correcta.
La matriu controlPoints té una longitud zero És possible que la malla s’hagi carregat però no contingui cap geometria (p. ex., un grup buit a l’OBJ). Utilitzeu mesh.polygonCount per comprovar abans d’iterar els vèrtexs.
L’ús de memòria és alt per a fitxers grans Carrega des del buffer amb scene.openFromBuffer() no redueix la memòria màxima: s’ha d’analitzar tot el fitxer. Per a fitxers grans (> 100 MB), assegureu-vos que el vostre procés Node.js disposi d’un heap suficient: node --max-old-space-size=4096 yourScript.js.
Errors de tipus: ’entity’ és de tipus ‘unknown’ El entity propietat està tipada de manera àmplia. Converteix a any o a una classe específica (Mesh, Camera, etc.) segons el que espereu a la vostra escena.
Preguntes freqüents (FAQ)
Quins formats es poden carregar amb scene.open()? OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX i COLLADA (.dae) són tots compatibles per a la importació. Passeu el *LoadOptions classe per a cada format.
Puc carregar un fitxer sense especificar opcions? Sí. scene.open('model.glb') funciona sense opcions per a formats que no requereixen configuració especial. Passar opcions es recomana per a OBJ perquè la resolució del material depèn de enableMaterials.
L’càrrega s’executa de manera asíncrona? No. scene.open() i scene.openFromBuffer() són sincròniques. Envolta-les en un fil de treball o setImmediate si necessites mantenir un bucle d’esdeveniments responsiu.
Es suporta l’exportació OBJ? Sí. L’exportació OBJ es suporta via scene.save('output.obj'). El .mtl el fitxer de material s’escriu automàticament al costat del .obj fitxer.
On s’espera trobar el fitxer .mtl en carregar un OBJ? Per defecte, l’analitzador busca el .mtl fitxer referenciat dins de l’OBJ (mtllib directiva) relativa al directori del fitxer OBJ. Assegureu-vos que ambdós fitxers siguin a la mateixa carpeta.