Kuinka ladata 3D-malleja TypeScriptissä

Kuinka ladata 3D-malleja TypeScriptissä

@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 formaatti‑kohtaisilla latausasetuksilla, sitten selaa scene.rootNode päästäksesi geometriaan, materiaaleihin ja muunnoksiin.

Vaiheittainen opas

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

Lisää paketti projektiisi. Natiivibinaareja tai alusta‑kohtaisia rakennustyökaluja ei tarvita; vain Node.js 18 tai uudempi.

npm install @aspose/3d

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

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

Vaihe 2: Tuo kohtaus ja formaattiin liittyvät asetukset

Jokainen formaatti paljastaa 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() tiedostopolun ja valinnaisen load-options-objektin kanssa. 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:stä, joka on jo muistissa (hyödyllistä serverittömissä tai suoratoistoympä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

Kohtausgrafiikka on puu, jonka juuri on scene.rootNode. Jokainen Node voi sisältää alisolmuja ja valinnaisen entity (verkko, 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ääsy verkon kärkipisteiden tietoihin controlPointsin kautta

Kun solmun entiteetti on Mesh, voit lukea raakat ohjauspisteet (solmut) controlPoints-taulukosta. Jokainen alkio on Vector4, jossa on 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 materiaalin 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

Error: Cannot find module ‘@aspose/3d/formats/obj’ Formaattien alipolut 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" kohteessa tsconfig.json.

scene.rootNode.childNodes on tyhjä open()-kutsun jälkeen
Jotkut OBJ‑tiedostot käyttävät epäsäännöllisiä rivinvaihtoja tai niiltä puuttuu loppurivinvaihto. Varmista, että tiedosto on kelvollinen OBJ avaamalla se tekstieditorissa. Vahvista myös, että annoit ObjLoadOptions eikä geneeristä LoadOptions: formaattikohtaiset asetukset ovat tarpeen oikean käsittelyn varmistamiseksi.

controlPoints array has zero length
Verkko on saattanut olla ladattu, mutta se ei sisällä geometriaa (esim. tyhjä ryhmä OBJ-tiedostossa). Käytä mesh.polygonCount tarkistamaan ennen kuin iteroit verteksit.

Muistin käyttö on korkea suurille tiedostoille Load-from-buffer scene.openFromBuffer():lla ei vähennä huippumuistia: koko tiedosto on parsittava. 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’
entity-ominaisuus on määritelty laajasti. Muunna any:ksi tai tiettyyn luokkaan (Mesh, Camera, jne.) sen mukaan, mitä odotat näkymässäsi.

Usein kysytyt kysymykset (UKK)

Mitä formaatteja scene.open() voi ladata? OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX ja COLLADA (.dae) ovat kaikki tuettuja tuonnissa. Anna kullekin formaatille vastaava *LoadOptions luokka.

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

Ladataanko 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 scene.save('output.obj') kautta. .mtl-materiaalitiedosto kirjoitetaan automaattisesti .obj-tiedoston yhteyteen.

Missä .mtl‑tiedosto odotetaan ladattaessa OBJ?
Oletuksena jäsentelijä etsii .mtl‑tiedostoa, johon viitataan OBJ:n sisällä (mtllib‑direktiivi) suhteessa OBJ‑tiedoston hakemistoon. Varmista, että molemmat tiedostot ovat samassa kansiossa.

Katso myös

 Suomi