Hoe 3D-modellen te laden in TypeScript

Hoe 3D-modellen te laden in TypeScript

De @aspose/3d pakket geeft TypeScript- en Node.js-toepassingen een eenvoudige API voor het openen van 3D‑scènebestanden. Scene is het rootobject: roep scene.open() met een bestandspad en optionele format‑specifieke laadopties, en doorloop vervolgens scene.rootNode om toegang te krijgen tot geometrie, materialen en transformaties.

Stapsgewijze gids

Stap 1: Installeer @aspose/3d via npm

Voeg het pakket toe aan je project. Er zijn geen native binaries of platformspecifieke build‑tools nodig; alleen Node.js 18 of hoger.

npm install @aspose/3d

Voor TypeScript‑projecten zijn type‑definities bij het pakket inbegrepen:

##tsconfig.json: minimum required settings
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "strict": true
  }
}

Stap 2: Importeer Scene en format‑specifieke opties

Elk formaat biedt zijn eigen loader‑klasse en opties‑object onder een sub‑pad. 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, en roep vervolgens scene.open() met het bestandspad en een optioneel load‑options object. De oproep 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 scene‑nodes

De scènegrafiek is een boom met als wortel scene.rootNode. Elk Node kan onderliggende knooppunten 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‑vertex‑data via controlPoints

Wanneer de entiteit van een knooppunt een Mesh,kun je de ruwe controlepunten (vertices) lezen van de controlPoints array. Elk item 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 stelt eigenschappen beschikbaar om te bepalen hoe bijbehorende .mtl materiaalbestanden en textures 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.entity && node.entity.material) {
        console.log(`Material on "${node.name}": ${node.entity.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 dan "moduleResolution": "node16" of "bundler" in tsconfig.json.

scene.rootNode.childNodes is leeg na open() Sommige OBJ‑bestanden gebruiken niet‑standaard regeleinden of missen een afsluitende nieuwe regel. Controleer of het bestand een geldige OBJ is door het in een teksteditor te openen. Bevestig ook dat je hebt doorgegeven ObjLoadOptions en niet een generieke LoadOptions: de formaat‑specifieke opties zijn vereist voor correcte dispatch.

controlPoints‑array heeft lengte nul De mesh is mogelijk geladen maar bevat geen geometrie (bijv. een lege groep in de OBJ). Gebruik mesh.polygonCount om te controleren voordat je door vertices iterereert.

Geheugengebruik is hoog voor grote bestanden Load‑from‑buffer met scene.openFromBuffer() verlaagt het piekgeheugen niet: het volledige bestand moet worden geparseerd. Zorg voor grote bestanden (> 100 MB) dat je Node.js‑proces voldoende heap heeft: node --max-old-space-size=4096 yourScript.js.

Typefouten: ’entity’ is van type ‘unknown’ De entity eigenschap is breed getypeerd. Cast naar any of naar een specifieke klasse (Mesh, Camera, enz.) afhankelijk van wat je verwacht in je scène.

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.

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 materiaaluitlezing afhankelijk is van enableMaterials.

Wordt het laden asynchroon uitgevoerd? Nee. scene.open() en scene.openFromBuffer() zijn synchroon. Plaats ze in een worker-thread of setImmediate als je een event loop responsief wilt houden.

Wordt OBJ-export ondersteund? Ja. OBJ-export wordt ondersteund via scene.save('output.obj'). De .mtl materiaalbestand wordt automatisch naast de .obj bestand.

Waar wordt het .mtl-bestand verwacht bij het laden van OBJ? Standaard zoekt de parser naar de .mtl bestand dat binnen 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.

Zie ook

 Nederlands