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
| Formaat | Optiesklasse | Importpad | Belangrijke opties |
|---|---|---|---|
| OBJ | ObjLoadOptions | @aspose/3d/formats/obj | enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
| glTF / GLB | (niet vereist) | N/A | Automatisch gedetecteerd; geen optiesklasse nodig |
| STL | StlLoadOptions | @aspose/3d/formats/stl | (geen configureerbare opties in de huidige versie) |
| FBX | FbxLoadOptions | @aspose/3d/formats/fbx | (geen configureerbare opties in de huidige versie) |
| COLLADA | ColladaLoadOptions | @aspose/3d/formats/collada | (geen configureerbare opties in de huidige versie) |
| 3MF | (niet vereist) | N/A | Automatisch gedetecteerd |
Veelvoorkomende laadfouten
| Symptoom | Oorzaak | Oplossing |
|---|---|---|
Error: Cannot find module '@aspose/3d/formats/obj' | moduleResolution niet ingesteld op node | Toevoegen "moduleResolution": "node" naar tsconfig.json |
| Lege node-lijst na het laden van OBJ | .mtl sidecar ontbreekt of enableMaterials niet ingesteld | Instellen options.enableMaterials = true en zorg ervoor .mtl in dezelfde map staat |
Scene laadt maar rootNode.childNodes is leeg | Formaat gebruikt één enkele root-mesh, geen kindknopen | Toegang scene.rootNode.entity direct |
openFromBuffer gooit een fout bij binaire STL | Buffer was onjuist gesneden (achtervolgende bytes ontbreken) | Gebruik de volledige readFileSync() output zonder te snijden |
| Animatieclips-array is leeg na FBX-lading | FBX-bestand gebruikt gebakken transformaties, geen clips | Animatie wordt per frame gebakken; de clip-array zal leeg zijn |
Zie ook
- 3D-modellen opslaan: exportopties en
saveToBuffer - Scènegraph: doorlopen en wijzigen van de knooppunt‑hiërarchie
- API-overzicht: alle klassen en enumeraties
- Formaatondersteuning: volledige lees‑/schrijfmatrix