Kako učitati 3D modele u TypeScriptu

Kako učitati 3D modele u TypeScriptu

@aspose/3d paket daje TypeScript i Node.js aplikacijama jednostavno API za otvaranje 3D datoteka scena. Scene je korijenski objekt: pozovite scene.open() s putanjom do datoteke i opcionalnim opcijama učitavanja specifičnim za format, zatim pređite scene.rootNode kako biste pristupili geometriji, materijalima i transformacijama.

Vodič korak po korak

Korak 1: Instalirajte @aspose/3d putem npm

Dodajte paket u svoj projekt. Nisu potrebni izvorni 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: Uvoz scene i opcije specifične za format

Svaki format izlaže svoju vlastitu 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 ostale formate uzorak 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 pomoću scene.open()

Stvorite instancu Scene, zatim pozovite scene.open() s putanjom do datoteke i opcionalnim objektom load-options. Poziv je sinkroniziran.

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 koji je 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 s korijenom u scene.rootNode. Svaki Node može sadržavati podčvorove i opcionalni 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: Pristup podacima vrhova mreže putem controlPoints

Kada je entitet čvora Mesh, možete pročitati sirove kontrolne točke (vrhove) iz niza controlPoints. Svaki unos je Vector4 s komponentama x, y, z i w.

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 načina na koji se prate i razrješavaju prateće .mtl datoteke materijala i teksture.

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’
Podputevi formata zahtijevaju izvoz paketa Node.js 12.7+. Provjerite jeste li na Node.js 18 ili novijem. Ako koristite TypeScript, postavite "moduleResolution": "node16" ili "bundler" u tsconfig.json.

scene.rootNode.childNodes is empty after open() Neki OBJ datoteke koriste nestandardne završetke redaka ili im nedostaje završni novi red. Provjerite je li datoteka valjani OBJ tako da je otvorite u tekstualnom editoru. Također potvrdite da ste proslijedili ObjLoadOptions, a ne generički LoadOptions: formatno‑specifične opcije su potrebne za ispravno usmjeravanje.

controlPoints array ima nultu duljinu
Mreža je možda učitana, ali ne sadrži geometriju (npr., prazan grup u OBJ-u). Upotrijebite mesh.polygonCount da provjerite prije iteriranja vrhova.

Potrošnja memorije je visoka za velike datoteke
Učitavanje iz međuspremnika 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 hrpe: node --max-old-space-size=4096 yourScript.js.

Greške tipa: ’entity’ je tipa ‘unknown’
Svojstvo entity je široko tipizirano. Pretvorite 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 scene.open() može učitati? 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 rezolucija materijala ovisi o enableMaterials.

Pokreće li se učitavanje asinkrono? Ne. scene.open() i scene.openFromBuffer() su sinkroni. Umotajte ih u radni thread ili setImmediate ako trebate održati petlju događaja responzivnom.

Je li izvoz OBJ podržan? Da. Izvoz OBJ podržan je putem scene.save('output.obj'). Datoteka materijala .mtl automatski se zapisuje uz datoteku .obj.

Gdje se očekuje .mtl datoteka prilikom učitavanja OBJ? Prema zadanim postavkama, parser traži .mtl datoteku navedenu unutar OBJ‑a (mtllib direktiva) relativno na direktorij OBJ datoteke. Provjerite da su obje datoteke u istoj mapi.

Vidi također

 Hrvatski