Kako učitati 3D modele u TypeScriptu
The @aspose/3d paket daje TypeScript i Node.js aplikacijama jednostavno API za otvaranje 3D scena datoteka. Scene je korijenski objekt: poziv scene.open() s putanjom do datoteke i opcionalnim opcijama učitavanja specifičnim za format, zatim pretražite scene.rootNode za pristup geometriji, materijalima i transformacijama.
Vodič korak po korak
Korak 1: Instalirajte @aspose/3d putem npm
Dodajte paket u svoj projekt. Nisu potrebne nativne binarne datoteke niti alati za izgradnju specifični za platformu; samo Node.js 18 ili noviji.
npm install @aspose/3dZa TypeScript projekte, definicije tipova su uključene u paket:
##tsconfig.json: minimum required settings
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true
}
}Korak 2: Uvezite Scene i opcije specifične za format
Svaki format izlaže svoju klasu učitavača i objekt opcija pod podputanjom. Uvezite samo ono što vam je potrebno:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Za druge formate obrazac je identičan:
import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';Korak 3: Otvorite 3D datoteku koristeći scene.open()
Molim vas, pošal Scene instanca, zatim pozovite scene.open() s putanjom datoteke i opcionalnim load‑options objektom. Poziv je sinhron.
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');Za učitavanje iz Buffer već u memoriji (korisno u serverless ili streaming kontekstima):
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());Korak 4: Prođite kroz čvorove scene
Graf scene je stablo ukorijenjeno u scene.rootNode. Svaki Node može sadržavati podčvorove i opcionalno entity (mreža, kamera, svjetlo, itd.).
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);Korak 5: Pristupite podacima vrhova mreže putem controlPoints
Kada je entitet čvora. Mesh, možete pročitati sirove kontrolne točke (vrhove) iz controlPoints array. Svaki unos je Vector4 s x, y, z, i w komponente.
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)}`);
}
}
}Korak 6: Konfigurirajte ObjLoadOptions za učitavanje materijala
ObjLoadOptions izlaže svojstva za kontrolu kako se prateći .mtl datoteke materijala i teksture razrješavaju.
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}`);
}
}Uobičajeni problemi i rješenja
Greška: Nije moguće pronaći modul ‘@aspose/3d/formats/obj’ Podputanje formata zahtijevaju izvoz paketa Node.js 12.7+. Provjerite da koristite Node.js 18 ili noviji. Ako koristite TypeScript, postavite "moduleResolution": "node16" ili "bundler" u tsconfig.json.
scene.rootNode.childNodes je prazan nakon open() Neke OBJ datoteke koriste nestandardne završetke redaka ili nemaju završni novi red. Provjerite je li datoteka valjani OBJ otvaranjem u tekstualnom editoru. Također potvrdite da ste proslijedili ObjLoadOptions i ne generički LoadOptions: formatno-specifične opcije su potrebne za ispravno slanje.
niz controlPoints ima nultu duljinu Mreža je možda učitana, ali ne sadrži geometriju (npr., prazna grupa u OBJ). Upotrijebite mesh.polygonCount za provjeru prije iteracije vrhova.
Korištenje memorije je visoko za velike datoteke Učitavanje iz memorijskog spremnika s scene.openFromBuffer() ne smanjuje vršnu memoriju: cijela datoteka mora biti parsirana. Za velike datoteke (> 100 MB), osigurajte da vaš Node.js proces ima dovoljno heap memorije: node --max-old-space-size=4096 yourScript.js.
Pogreške tipa: ’entity’ je tipa ‘unknown’ The entity svojstvo je tipizirano široko. Pretvori u any ili u određenu klasu (Mesh, Camera, itd.) ovisno o tome što očekujete u svojoj sceni.
Često postavljana pitanja (FAQ)
Koje formate može učitati scene.open()? OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX i COLLADA (.dae) svi su podržani za uvoz. Proslijedite odgovarajuću *LoadOptions klasu za svaki format.
Mogu li učitati datoteku bez specificiranja opcija? Da. scene.open('model.glb') radi bez opcija za formate koji ne zahtijevaju posebnu konfiguraciju. Prosljeđivanje opcija preporučuje se za OBJ jer razlučivost materijala ovisi o enableMaterials.
Izvodi li se učitavanje asinkrono? Ne. scene.open() i scene.openFromBuffer() su sinkroni. Omotajte ih u radni thread ili setImmediate ako trebate održati odzivnost petlje događaja.
Je li OBJ izvoz podržan? Da. OBJ izvoz je podržan putem scene.save('output.obj'). Datoteka .mtl datoteka materijala se automatski zapisuje uz .obj datoteka.
Gdje se očekuje .mtl datoteka pri učitavanju OBJ-a? Prema zadanim postavkama, parser traži .mtl datoteka navedena unutar OBJ-a (mtllib directive) relativno na direktorij OBJ datoteke. Provjerite da su obje datoteke u istoj mapi.