Kuinka ladata 3D-malleja TypeScriptissä

Kuinka ladata 3D-malleja TypeScriptissä

Se @aspose/3d paketti tarjoaa TypeScript- ja Node.js-sovelluksille suoraviivaisen API:n 3D‑kohtaus tiedostojen avaamiseen. Scene on juurielementti: kutsu scene.open() tiedostopolulla ja valinnaisilla formaattiin liittyvillä latausasetuksilla, sitten selaa scene.rootNode päästäksesi käsiksi geometriaan, materiaaleihin ja muunnoksiin.

Vaiheittainen opas

Vaihe 1: Asenna @aspose/3d npm:n kautta

Lisää paketti projektiisi. Ei vaadita natiivibinaareja tai alusta‑kohtaisia rakennustyökaluja; vain Node.js 18 tai uudempi.

npm install @aspose/3d

TypeScript-projekteissa tyyppimääritelmät sisältyvät pakettiin:

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

Vaihe 2: Tuo Scene ja formaatti‑kohtaiset asetukset

Jokainen formaatti tarjoaa oman latausluokkansa ja asetuskohteensa alipolun alla. Tuo vain tarvitsemasi:

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';

Muille formaateille malli on identtinen:

import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';

Vaihe 3: Avaa 3D‑tiedosto käyttämällä scene.open()

Luo Scene instanssi, sitten kutsu scene.open() tiedostopolulla ja valinnaisella load-options-objektilla. Kutsu on synkroninen.

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

Lataa Buffer jo muistiin (hyödyllinen serverless- tai suoratoisto-ympäristöissä):

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

Vaihe 4: Käy läpi kohtauksen solmut

Kohtausgrafi on puu, jonka juuri on scene.rootNode. Node voi sisältää alisolmuja ja valinnaisen entity (mesh, kamera, valo, jne.).

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

Vaihe 5: Pääse verkon kärkipisteisiin controlPoints:n kautta

Kun solmun entiteetti on Mesh,voit lukea raakatason ohjauspisteet (kärjet) kohteesta controlPoints taulukko. Jokainen merkintä on Vector4 kanssa x, y, z, ja w komponentit.

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

Vaihe 6: Määritä ObjLoadOptions materiaalien lataamista varten

ObjLoadOptions paljastaa ominaisuuksia, joilla hallitaan, miten mukana olevat .mtl materiaalitiedostot ja tekstuurit ratkaistaan.

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

Yleisiä ongelmia ja korjauksia

Virhe: Moduulia ‘@aspose/3d/formats/obj’ ei löydy Formaattialikansiopolut vaativat Node.js 12.7+ pakettiviennit. Varmista, että käytät Node.js 18:aa tai uudempaa. Jos käytät TypeScriptiä, aseta "moduleResolution": "node16" tai "bundler" in tsconfig.json.

scene.rootNode.childNodes on tyhjä open()-kutsun jälkeen Jotkut OBJ-tiedostot käyttävät epästandardeja rivinvaihtoja tai niiltä puuttuu loppurivinvaihto. Varmista, että tiedosto on kelvollinen OBJ avaamalla se tekstieditorissa. Vahvista myös, että olet antanut ObjLoadOptions eikä geneerinen LoadOptions: formaattikohtaiset asetukset vaaditaan oikeaan käsittelyyn.

controlPoints-taulukon pituus on nolla Verkko on ehkä ladattu, mutta se ei sisällä geometriaa (esim. tyhjä ryhmä OBJ-tiedostossa). Käytä mesh.polygonCount tarkistamaan ennen solmujen läpikäyntiä.

Muistin käyttö on korkea suurille tiedostoille Load-from-buffer käyttäen scene.openFromBuffer() ei vähennä huippumuistia: koko tiedosto on purettava. Suurille tiedostoille (> 100 MB) varmista, että Node.js-prosessillasi on riittävä heap: node --max-old-space-size=4096 yourScript.js.

Tyyppivirheet: ’entity’ on tyyppiä ‘unknown’ Se entity property on tyypitetty laajasti. Cast to any tai tiettyyn luokkaan (Mesh, Camera, jne.) riippuen siitä, mitä odotat kohtauksessasi.

Usein kysytyt kysymykset (UKK)

Mitkä formaatit voidaan ladata scene.open()-funktiolla? OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX ja COLLADA (.dae) kaikki tuetaan tuonnissa. Anna vastaava *LoadOptions luokka kullekin formaatille.

Voinko ladata tiedoston ilman, että määrittelen asetuksia? Kyllä. scene.open('model.glb') toimii ilman asetuksia formaateille, jotka eivät vaadi erityiskonfiguraatiota. Asetusten antamista suositellaan OBJ:lle, koska materiaalin resoluutio riippuu enableMaterials.

Suoritetaanko lataus asynkronisesti? Ei. scene.open() ja scene.openFromBuffer() ovat synkronisia. Kääri ne työntekijä‑säikeeseen tai setImmediate jos sinun täytyy pitää tapahtumasilmukka reagoivana.

Onko OBJ‑vienti tuettu? Kyllä. OBJ‑vienti on tuettu kautta scene.save('output.obj'). Tiedosto .mtl materiaalitiedosto kirjoitetaan automaattisesti samalle paikalle kuin .obj tiedosto.

Missä .mtl-tiedostoa odotetaan, kun ladataan OBJ? Oletuksena jäsennin etsii .mtl tiedostoa, johon viitataan OBJ:n sisällä (mtllib directive) suhteessa OBJ‑tiedoston hakemistoon. Varmista, että molemmat tiedostot ovat samassa kansiossa.

Katso myös

 Suomi