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/3dTypeScript-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.