Kako izvesti 3D scene u glTF/GLB u TypeScript-u

Kako izvesti 3D scene u glTF/GLB u TypeScript-u

Aspose.3D FOSS podržava glTF 2.0 i kao format za uvoz i izvoz. Isti Scene objekat može biti popunjen iz OBJ, FBX, STL ili drugog izvornog fajla i zatim zapisan u .gltf (JSON + eksterni binarni) ili .glb (jedinstveni binarni kontejner) postavljanjem jedne zastavice na GltfSaveOptions.

Vodič korak po korak

Korak 1: Instalirajte @aspose/3d

npm install @aspose/3d

Potvrdite da je Node.js 18 ili noviji aktivan:

node --version   # must be >= 16.0.0

Korak 2: Uvezite Scene, GltfSaveOptions i GltfFormat

import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';

GltfFormat je opisnik formata prosleđen scene.save(). GltfSaveOptions sadrži svu konfiguraciju izvoza.

Ako takođe učitavate izvorni fajl (npr. OBJ), uvezite odgovarajuće opcije učitavanja:

import { ObjLoadOptions } from '@aspose/3d/formats/obj';

Korak 3: Izgradite ili učitajte scenu

Opcija A: Učitajte iz postojećeg fajla (konverzija OBJ → GLB):

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';

const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());

Opcija B: Programatski izgradite minimalnu scenu:

import { Scene, Node, Mesh } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';

const scene = new Scene();
const childNode = new Node('cube');
scene.rootNode.addChildNode(childNode);
// Attach geometry to childNode as needed

Korak 4: Konfigurišite GltfSaveOptions

GltfSaveOptions kontroliše format izlaza i detalje kodiranja.

const saveOpts = new GltfSaveOptions();

// Set to true for a single binary .glb file
// Set to false (default) for JSON .gltf + separate .bin
saveOpts.binaryMode = true;

Dodatne opcije koje možete postaviti:

SvojstvoTipPodrazumevanoEfekat
binaryModebooleanfalsetrue → GLB, false → glTF JSON
flipTexCoordVbooleantruePreokreni vertikalnu osu UV za kompatibilnost sa motorom

Korak 5: Sačuvajte koristeći scene.save()

Prosledi putanju izlaza, GltfFormat opisivač, i konfigurisane opcije:

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';

const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());

const saveOpts = new GltfSaveOptions();
saveOpts.binaryMode = true;   // produce .glb

scene.save('output.glb', GltfFormat.getInstance(), saveOpts);
console.log('Converted to GLB successfully');

Za generisanje JSON-a .gltf датотеку уместо:

saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');

Korak 6: Proverite izlazni fajl

Proverite da izlazni fajl postoji i da ima nenultu veličinu:

import * as fs from 'fs';

const outputPath = 'output.glb';
const stats = fs.statSync(outputPath);
console.log(`Output file size: ${stats.size} bytes`);

if (stats.size === 0) {
    throw new Error('Export produced an empty file: check scene content');
}

Za verifikaciju povratnog puta, ponovo učitajte GLB i proverite broj čvorova:

import { Scene } from '@aspose/3d';
import { GltfLoadOptions } from '@aspose/3d/formats/gltf';

const verify = new Scene();
verify.open('output.glb', new GltfLoadOptions());

let nodeCount = 0;
function countNodes(node: any): void {
    nodeCount++;
    for (const child of node.childNodes) countNodes(child);
}
countNodes(verify.rootNode);

console.log(`Round-trip verification: ${nodeCount} node(s) in output`);

Uobičajeni problemi i rešenja

OBJ датотека материјала није пронађена након извоза Приликом чувања у OBJ преко scene.save('output.obj'), .mtl датотека материјала се пише поред .obj датотеке аутоматски. Уверите се да је излазни директоријум уписив и да су обе датотеке задржане заједно.

Излазни .glb је мањи од очекиваног / мреже недостају Ако учитана сцена има чворове без ентитета (нпр., празне групе из OBJ), GLB неће садржати геометрију тих чворова. Потврдите да ваша улазна датотека има стварне податке о полигонима користећи mesh.controlPoints.length > 0 pre nego što se sačuva.

Ne mogu da pronađem modul ‘@aspose/3d/formats/gltf’ Uverite se da koristite Node.js 18+ i da @aspose/3d je instaliran u istom node_modules kao vaša ulazna tačka. Pokrenite npm ls @aspose/3d da potvrdite da je verzija 24.12.0 ili novija.

GltfFormat.getInstance() vraća undefined Ovo ukazuje na neslaganje verzija između glavnog @aspose/3d paket i keširana starija verzija. Obrišite node_modules i package-lock.json, zatim pokrenite npm install ponovo.

Teksture nedostaju u izlaznom GLB‑u Osigurajte binaryMode = true je postavljeno da proizvodi samostalni GLB. Za glTF JSON izlaz, fajlovi slika tekstura moraju biti prisutni uz izlazni fajl jer se referenciraju relativnom putanjom.

Greška tipa: Argument tipa ‘GltfSaveOptions’ nije dodeljiv Osigurajte da oba Scene i GltfSaveOptions se uvoze iz iste instalirane instance paketa. Mešovite instalacije (globalne + lokalne) mogu izazvati neslaganja u interfejsu.

Često postavljana pitanja (FAQ)

Koja je razlika između glTF i GLB? glTF 2.0 JSON (.gltf) čuva graf scene kao čitljiv JSON fajl sa odvojenim .bin baferima i slikovnim fajlovima. GLB (.glb) pakira sve u jedan binarni kontejner. Set binaryMode = true za GLB, false za JSON glTF.

Mogu li da izvezem scenu koja je u potpunosti izgrađena u kodu (bez izvornog fajla)? Da. Kreirajte Scene, dodajte Node objekte, prikačite Mesh ili druge entitete, zatim pozovite scene.save(). Scena ne mora da potiče iz učitanog fajla.

Da li je izvoz glTF-a bez gubitka? Za geometriju i transformacije, da. Materijali se mapiraju na glTF PBR svojstva materijala gde je moguće. Vlasničke FBX ekstenzije materijala možda neće savršeno da se vrate.

Mogu li izvesti u STL ili 3MF umesto? Da. Šablon je identičan; uvezite odgovarajući format *SaveOptions i *Format.getInstance():

import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);

Da li scene.save() radi asinhrono? Ne. scene.save() je sinhrono. Umotajte ga u radni thread ako treba da izbegnete blokiranje event loop-a tokom velikih izvoza.

Koje Node.js verzije su podržane? Node.js 18, 20 i 22+. Node.js 16 i starije verzije nisu podržane.

Vidi takođe

 Српски