3D-modellen laden

@aspose/3d biedt twee laadmethoden op de Scene klasse: open() voor het laden van een bestandspad en openFromBuffer() voor in‑memory‑gegevens. Formaatdetectie gebeurt automatisch op basis van binaire magic‑nummers of de bestandsextensie, dus je hoeft het bronformaat zelden expliciet op te geven.

Laden vanaf een bestandspad

Geef de bestandspad‑string door aan scene.open(). De bibliotheek detecteert het formaat aan de hand van de bestandsextensie en, voor binaire formaten, aan de hand van de magic‑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() vervangt alle bestaande scene‑inhoud. Als je meerdere bestanden moet laden, maak dan afzonderlijke Scene instanties.

OBJ laden met materialen

OBJ‑bestanden verwijzen naar materialen via een sidecar .mtl bestand. Materiaal laden is standaard ingeschakeld (ObjLoadOptions.enableMaterials = true). Geef ObjLoadOptions om dit en andere laad‑tijdopties te regelen:

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}`);
}

Laden vanuit een buffer

Gebruik openFromBuffer() wanneer de bestandsgegevens al in het geheugen staan, bijvoorbeeld van een HTTP‑opvraag, een database‑BLOB of een zip‑archief‑extractie. Dit voorkomt schrijven naar schijf:

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`);

Voor binaire formaten (GLB, STL binary, 3MF) leest de bibliotheek de magic‑bytes uit de buffer om het formaat automatisch te detecteren, zodat je kunt doorgeven undefined als het optiesargument:

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

Laden via HTTP (Node.js 18+)

Haal een extern asset op en laad het zonder het bestandssysteem aan te raken:

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`);

Inspecteren van de geladen scène

Na het laden, doorloop de scène‑grafiek om knooppunten te enumereren en geometrie te identificeren:

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);

Lezen van asset‑metadata

De assetInfo eigenschap geeft metadata op bestandsniveau weer:

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}`);
}

Niet alle formaten vullen assetInfo. FBX en COLLADA hebben rijke metadata; OBJ en STL hebben dat meestal niet.

Referentie voor formaat‑specifieke laadopties

FormaatOptiesklasseImportpadBelangrijke opties
OBJObjLoadOptions@aspose/3d/formats/objenableMaterials, flipCoordinateSystem, scale, normalizeNormal
glTF / GLB(niet vereist)N/AAutomatisch gedetecteerd; geen optiesklasse nodig
STLStlLoadOptions@aspose/3d/formats/stl(geen configureerbare opties in de huidige versie)
FBXFbxLoadOptions@aspose/3d/formats/fbx(geen configureerbare opties in de huidige versie)
COLLADAColladaLoadOptions@aspose/3d/formats/collada(geen configureerbare opties in de huidige versie)
3MF(niet vereist)N/AAutomatisch gedetecteerd

Veelvoorkomende laadfouten

SymptoomOorzaakOplossing
Error: Cannot find module '@aspose/3d/formats/obj'moduleResolution niet ingesteld op nodeToevoegen "moduleResolution": "node" naar tsconfig.json
Lege node-lijst na het laden van OBJ.mtl sidecar ontbreekt of enableMaterials niet ingesteldInstellen options.enableMaterials = true en zorg ervoor .mtl in dezelfde map staat
Scene laadt maar rootNode.childNodes is leegFormaat gebruikt één enkele root-mesh, geen kindknopenToegang scene.rootNode.entity direct
openFromBuffer gooit een fout bij binaire STLBuffer was onjuist gesneden (achtervolgende bytes ontbreken)Gebruik de volledige readFileSync() output zonder te snijden
Animatieclips-array is leeg na FBX-ladingFBX-bestand gebruikt gebakken transformaties, geen clipsAnimatie wordt per frame gebakken; de clip-array zal leeg zijn

Zie ook

 Nederlands