Laster inn 3D-modeller
@aspose/3d gir to innlastingsmetoder på Scene klassen: open() for innlasting via filsti og openFromBuffer() for data i minnet. Formatgjenkjenning er automatisk fra binære magiske tall eller filendelse, så du sjelden trenger å spesifisere kildeformatet eksplisitt.
Laste fra en filsti
Send filstistrengen til scene.open(). Biblioteket oppdager formatet fra filendelsen og, for binære formater, fra de magiske bytes:
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() erstatter alt eksisterende sceninnhold. Hvis du trenger å laste flere filer, opprett separate Scene instanser.
Laste OBJ med materialer
OBJ-filer refererer materialer gjennom en sidecar .mtl fil. Materialinnlasting er aktivert som standard (ObjLoadOptions.enableMaterials = true). Send ObjLoadOptions for å kontrollere dette og andre innlastingsalternativer:
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}`);
}Laste fra en buffer
Bruk openFromBuffer() når fildataene allerede er i minnet, for eksempel fra en HTTP‑henting, en database‑BLOB eller en zip‑arkivuttrekking. Dette unngår skriving til 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`);For binære formater (GLB, STL binary, 3MF), biblioteket leser de magiske bytes fra bufferet for å oppdage formatet automatisk, så du kan sende undefined som options-argumentet:
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
Laste fra HTTP (Node.js 18+)
Hent en ekstern ressurs og last den uten å berøre filsystemet:
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`);Inspisere den innlastede scenen
Etter innlasting, gå gjennom scenegrafen for å liste opp noder og identifisere geometri:
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);Lese metadata for ressursen
Den assetInfo egenskapen eksponerer metadata på filnivå:
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}`);
}Ikke alle formater fyller ut assetInfo. FBX og COLLADA har rik metadata; OBJ og STL har vanligvis ikke det.
Referanse for formatspesifikke innlastingsalternativer
| Format | Alternativklasse | Importsti | Nøkkelalternativer |
|---|---|---|---|
| OBJ | ObjLoadOptions | @aspose/3d/formats/obj | enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
| glTF / GLB | (ingen kreves) | N/A | Automatisk oppdaget; ingen alternativklasse nødvendig |
| STL | StlLoadOptions | @aspose/3d/formats/stl | (ingen konfigurerbare alternativer i nåværende versjon) |
| FBX | FbxLoadOptions | @aspose/3d/formats/fbx | (ingen konfigurerbare alternativer i nåværende versjon) |
| COLLADA | ColladaLoadOptions | @aspose/3d/formats/collada | (ingen konfigurerbare alternativer i nåværende versjon) |
| 3MF | (ingen kreves) | N/A | Automatisk oppdaget |
Vanlige innlastingsfeil
| Symptom | Årsak | Løsning |
|---|---|---|
Error: Cannot find module '@aspose/3d/formats/obj' | moduleResolution ikke satt til node | Legg til "moduleResolution": "node" til tsconfig.json |
| Tom node-liste etter lasting av OBJ | .mtl sidecar mangler eller enableMaterials ikke satt | Angi options.enableMaterials = true og sørg for .mtl er i samme katalog |
Scenen lastes men rootNode.childNodes er tom | Formatet bruker ett enkelt rotmesh, ikke undernoder | Tilgang scene.rootNode.entity direkte |
openFromBuffer kaster med binær STL | Bufferen ble skåret feil (etterfølgende byte mangler) | Bruk hele readFileSync() utdata uten å kutte |
| Arrayet med animasjonsklipp er tomt etter FBX-lastning | FBX-filen bruker bake‑transformasjoner, ikke klipp | Animasjon er bakt per ramme; klippearrayet vil være tomt |
Se også
- Lagrer 3D-modeller: eksportalternativer og
saveToBuffer - Scenegraf: å traversere og endre nodehierarkiet
- API-oversikt: alle klasser og enumerasjoner
- Formatstøtte: fullstendig lese/skriv-matrise