Kako izvesti 3D scene u glTF/GLB u TypeScriptu

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/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 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:

SvojstvoTipZadanoUčinak
binaryModebooleanfalsetrue → GLB, false → glTF JSON
flipTexCoordVbooleantruePreokreni 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.

Vidi također

 Hrvatski