Kako izvesti 3D scene u glTF/GLB u TypeScriptu
Aspose.3D FOSS podržava glTF 2.0 i kao format za uvoz i izvoz. Isti Scene objekt može biti popunjen iz OBJ, FBX, STL ili druge izvorne datoteke i zatim zapisan u .gltf (JSON + vanjski binarni) ili .glb (jedinstveni binarni kontejner) postavljanjem jedne zastavice na GltfSaveOptions.
Vodič korak po korak
Korak 1: Instalirajte @aspose/3d
npm install @aspose/3dPotvrdite da je Node.js 18 ili noviji aktivan:
node --version # must be >= 16.0.0Korak 2: Uvezite Scene, GltfSaveOptions i GltfFormat
import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';GltfFormat je opisnik formata proslijeđen scene.save(). GltfSaveOptions sadrži svu konfiguraciju izvoza.
Ako također učitavate izvornu datoteku (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će datoteke (pretvorba 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 izradite 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: Konfigurirajte GltfSaveOptions
GltfSaveOptions kontrolira 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:
| Svojstvo | Tip | Zadano | Učinak |
|---|---|---|---|
binaryMode | boolean | false | true → GLB, false → glTF JSON |
flipTexCoordV | boolean | true | Preokreni vertikalnu os UV-a radi kompatibilnosti s motorom |
Korak 5: Spremite koristeći scene.save()
Proslijedi put izlaza, GltfFormat opisnik i konfigurirane 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 generiranje JSON-a .gltf datoteka umjesto:
saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');Korak 6: Provjerite izlaznu datoteku
Provjerite da izlazna datoteka postoji i da ima veličinu veću od nule:
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 provjeru kružnog puta, ponovo učitajte GLB i provjerite 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 rješenja
OBJ datoteka materijala nije pronađena nakon izvoza Pri spremanju u OBJ putem scene.save('output.obj'), the .mtl datoteka materijala se zapisuje uz .obj datoteka automatski. Provjerite je li izlazni direktorij zapisiv i da su obje datoteke zadržane zajedno.
Izlazni .glb je manji od očekivanog / mreže nedostaju Ako učitana scena ima čvorove bez entiteta (npr. prazne grupe iz OBJ-a), GLB neće sadržavati geometriju tih čvorova. Potvrdite da vaša ulazna datoteka ima stvarne poligonske podatke koristeći mesh.controlPoints.length > 0 prije spremanja.
Nije moguće pronaći modul ‘@aspose/3d/formats/gltf’ Provjerite koristite li Node.js 18+ i da @aspose/3d je instaliran u istom node_modules kao vaša ulazna točka. Pokrenite npm ls @aspose/3d za potvrdu da je verzija 24.12.0 ili novija.
GltfFormat.getInstance() vraća undefined Ovo ukazuje na nesklad verzija između glavnog @aspose/3d paketa i keširane starije verzije. Izbrišite node_modules i package-lock.json, zatim pokrenite npm install ponovno.
Teksture nedostaju u izlaznom GLB-u Osigurajte binaryMode = true je postavljeno da proizvede samostalni GLB. Za glTF JSON izlaz, datoteke slika tekstura moraju biti prisutne uz izlaznu datoteku jer se referenciraju relativnom putanjom.
Greška tipa: Argument tipa ‘GltfSaveOptions’ nije dodijeljiv Osigurajte da oba Scene i GltfSaveOptions se uvoze iz iste instalirane instance paketa. Miješani instalacije (globalne + lokalne) mogu uzrokovati nesklad sučelja.
Često postavljana pitanja (FAQ)
Koja je razlika između glTF i GLB? glTF 2.0 JSON (.gltf) pohranjuje graf scenske strukture kao ljudski čitljivu JSON datoteku s odvojenim .bin baferima i slikovnim datotekama. GLB (.glb) pakira sve u jedan binarni kontejner. Postavite binaryMode = true za GLB, false za JSON glTF.
Mogu li izvesti scenu koja je u potpunosti izgrađena u kodu (bez izvorne datoteke)? Da. Stvorite Scene, dodajte Node objekte, pričvrstite Mesh ili druge entitete, zatim pozovite scene.save(). Scena ne mora potjecati iz učitane datoteke.
Je li izvoz glTF-a bez gubitka? Za geometriju i transformacije, da. Materijali se, gdje je moguće, mapiraju na glTF PBR svojstva materijala. Vlasnički FBX proširenja materijala možda neće savršeno round‑trip-ati.
Mogu li izvesti u STL ili 3MF umjesto toga? Da. Uzorak je identičan; uvezite odgovarajući format’s *SaveOptions i *Format.getInstance():
import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);Izvodi li se scene.save() asinkrono? Ne. scene.save() je sinkrono. Umotajte ga u radni thread ako trebate izbjegavati blokiranje petlje događaja tijekom velikih izvoza.
Koje Node.js verzije su podržane? Node.js 18, 20 i 22+. Node.js 16 i stariji nisu podržani.