Hoe 3D-modellen te laden in TypeScript
Het @aspose/3d-pakket biedt TypeScript- en Node.js-toepassingen een eenvoudige API voor het openen van 3D‑scènebestanden. Scene is het root‑object: roep scene.open() aan met een bestandspad en optionele formatspecifieke laadopties, en doorloop vervolgens scene.rootNode om toegang te krijgen tot geometrie, materialen en transformaties.
Stapsgewijze handleiding
Stap 1: Installeer @aspose/3d via npm
Voeg het pakket toe aan je project. Er zijn geen native binaries of platform‑specifieke buildtools vereist; alleen Node.js 18 of later.
npm install @aspose/3dVoor TypeScript‑projecten worden type‑definities meegeleverd met het pakket:
##tsconfig.json: minimum required settings
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true
}
}Stap 2: Scène importeren en formatspecifieke opties
Elk formaat biedt zijn eigen loaderklasse en opties‑object onder een subpad. Importeer alleen wat je nodig hebt:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Voor andere formaten is het patroon identiek:
import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';Stap 3: Open een 3D‑bestand met scene.open()
Maak een Scene‑instantie, roep vervolgens scene.open() aan met het bestandspad en een optioneel load‑options‑object. De aanroep is synchroon.
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');Om te laden vanuit een Buffer die al in het geheugen staat (handig in serverless- of streamingcontexten):
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());Stap 4: Itereer over scène‑knooppunten
De scenegraph is een boom die wortelt in scene.rootNode. Elke Node kan kindknooppunten bevatten en een optionele entity (mesh, camera, licht, enz.).
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);Stap 5: Toegang tot mesh-vertexgegevens via controlPoints
Wanneer de entiteit van een knoop een Mesh is, kun je de ruwe controlepunten (vertices) lezen uit de controlPoints array. Elke invoer is een Vector4 met x, y, z en w componenten.
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)}`);
}
}
}Stap 6: Configureer ObjLoadOptions voor het laden van materialen
ObjLoadOptions exposeert eigenschappen om te regelen hoe bijbehorende .mtl materiaalbestanden en texturen worden opgelost.
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}`);
}
}Veelvoorkomende problemen en oplossingen
Fout: Kan module ‘@aspose/3d/formats/obj’ niet vinden
De sub‑paden van het formaat vereisen Node.js 12.7+ package‑exports. Zorg ervoor dat je Node.js 18 of hoger gebruikt. Als je TypeScript gebruikt, stel "moduleResolution": "node16" of "bundler" in tsconfig.json.
scene.rootNode.childNodes is empty after open()
Sommige OBJ‑bestanden gebruiken niet‑standaard regeleinden of missen een afsluitende nieuwe regel. Controleer of het bestand een geldig OBJ‑bestand is door het te openen in een teksteditor. Bevestig ook dat je ObjLoadOptions hebt doorgegeven en niet een generieke LoadOptions: de formatspecifieke opties zijn vereist voor een correcte dispatch.
controlPoints array heeft een lengte van nul
De mesh is mogelijk geladen, maar bevat geen geometrie (bijv. een lege groep in de OBJ). Gebruik mesh.polygonCount om te controleren voordat u door de vertices iterereert.
Geheugengebruik is hoog voor grote bestanden
Load-from-buffer met scene.openFromBuffer() vermindert het piekgeheugen niet: het hele bestand moet worden geparseerd. Voor grote bestanden (> 100 MB) moet u ervoor zorgen dat uw Node.js‑proces voldoende heap heeft: node --max-old-space-size=4096 yourScript.js.
Typefouten: ’entity’ is of type ‘unknown’
De entity eigenschap is breed getypeerd. Cast naar any of naar een specifieke klasse (Mesh, Camera, etc.) afhankelijk van wat je in je scène verwacht.
Veelgestelde vragen (FAQ)
Welke formaten kunnen worden geladen met scene.open()?
OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX en COLLADA (.dae) worden allemaal ondersteund voor import. Geef de overeenkomstige *LoadOptions-klasse voor elk formaat door.
Kan ik een bestand laden zonder opties op te geven?
Ja. scene.open('model.glb') werkt zonder opties voor formaten die geen speciale configuratie vereisen. Het doorgeven van opties wordt aanbevolen voor OBJ omdat de materiaalresolutie afhankelijk is van enableMaterials.
Wordt laden asynchroon uitgevoerd?
Nee. scene.open() en scene.openFromBuffer() zijn synchroon. Plaats ze in een worker thread of setImmediate als je de event loop responsief wilt houden.
Is OBJ-export ondersteund?
Ja. OBJ-export wordt ondersteund via scene.save('output.obj'). Het .mtl-materiaalbestand wordt automatisch geschreven naast het .obj-bestand.
Waar wordt het .mtl‑bestand verwacht bij het laden van OBJ?
Standaard zoekt de parser naar het .mtl‑bestand dat in de OBJ wordt gerefereerd (mtllib‑directive) relatief ten opzichte van de map van het OBJ‑bestand. Zorg ervoor dat beide bestanden in dezelfde map staan.