Kako učitati 3D modele u TypeScript-u

Kako učitati 3D modele u TypeScript-u

The @aspose/3d paket daje TypeScript i Node.js aplikacijama jednostavan API za otvaranje 3D scena fajlova. Scene je koreni objekat: pozovite scene.open() sa putanjom do fajla i opcionim opcijama učitavanja specifičnim za format, zatim pređite scene.rootNode da pristupite geometriji, materijalima i transformacijama.

Vodič korak po korak

Korak 1: Instalirajte @aspose/3d putem npm-a

Dodajte paket u vaš projekat. Nisu potrebni nativni binarni fajlovi niti alati za izgradnju specifični za platformu; samo Node.js 18 ili noviji.

npm install @aspose/3d

Za 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 objekat 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 fajl koristeći scene.open()

Kreirajte Scene instancu, zatim pozovite scene.open() sa putanjom do fajla i opcionim objektom za opcije učitavanja. 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 a 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: Iterirajte kroz čvorove scene

Graf scene je stablo sa korenom u scene.rootNode. Svaki Node može da sadrži podčvorove i opcioni entity (mesh, camera, light, 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 o vrhovima mesh‑a putem controlPoints

Kada je entitet čvora Mesh, možete pročitati sirove kontrolne tačke (vertices) iz the controlPoints niz. Svaki unos je Vector4 sa 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: Konfigurišite ObjLoadOptions za učitavanje materijala

ObjLoadOptions izlaže svojstva za kontrolu načina na koji prate .mtl materijalni fajlovi i teksture se razreš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.entity && node.entity.material) {
        console.log(`Material on "${node.name}": ${node.entity.material.constructor.name}`);
    }
}

Uobičajeni problemi i rešenja

Greška: Nije moguće pronaći modul ‘@aspose/3d/formats/obj’ Podputanje formata zahtevaju izvoz paketa Node.js 12.7+. Uverite se 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() Neki OBJ fajlovi koriste nestandardne završetke linija ili nemaju završni novi red. Proverite da li je fajl validan OBJ tako što ćete ga otvoriti u tekstualnom editoru. Takođe potvrdite da ste prosledili ObjLoadOptions i ne generički LoadOptions: format-specifične opcije su potrebne za ispravno prosleđivanje.

niz controlPoints ima dužinu nula Mreža je možda učitana, ali ne sadrži geometriju (npr., prazna grupa u OBJ). Koristite mesh.polygonCount da se proveri pre iteracije vrhova.

Korišćenje memorije je visoko za velike fajlove Učitavanje iz bafera sa scene.openFromBuffer() ne smanjuje maksimalnu memoriju: ceo fajl mora biti parsiran. Za velike fajlove (> 100 MB), osigurajte da vaš Node.js proces ima dovoljno heap‑memorije: node --max-old-space-size=4096 yourScript.js.

Greške tipa: ’entity’ je tipa ‘unknown’ The entity svojstvo je tipizirano široko. Kastujte na any ili na određenu klasu (Mesh, Camera, itd.) u zavisnosti od toga šta očekujete u vašoj sceni.

Često postavljana pitanja (FAQ)

Koji formati se mogu učitati pomoću scene.open()? OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX i COLLADA (.dae) su svi podržani za uvoz. Prosledite odgovarajuću *LoadOptions klasu za svaki format.

Mogu li učitati fajl bez navođenja opcija? Da. scene.open('model.glb') radi bez opcija za formate koji ne zahtevaju posebnu konfiguraciju. Prosleđivanje opcija se preporučuje za OBJ jer rezolucija materijala zavisi od enableMaterials.

Da li se učitavanje izvršava asinhrono? Ne. scene.open() i scene.openFromBuffer() su sinhroni. Umotajte ih u radni thread ili setImmediate ako treba da održite petlju događaja responzivnom.

Da li je OBJ izvoz podržan? Da. OBJ izvoz je podržan putem scene.save('output.obj'). .mtl materialni fajl se automatski piše pored .obj datoteka.

Gde se očekuje .mtl fajl prilikom učitavanja OBJ? Podrazumevano, parser traži .mtl fajl referenciran unutar OBJ (mtllib direktiva) relativno u odnosu na direktorijum OBJ fajla. Uverite se da su oba fajla u istom folderu.

Vidi takođe

 Српски