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