Hogyan exportáljunk 3D jeleneteket glTF/GLB formátumba TypeScriptben

Hogyan exportáljunk 3D jeleneteket glTF/GLB formátumba TypeScriptben

Aspose.3D FOSS támogatja a glTF 2.0-t import és export formátumként egyaránt. Azonos Scene objektum betölthető egy OBJ, FBX, STL vagy más forrásfájlból, majd kiírható .gltf (JSON + külső bináris) vagy .glb (egyes bináris konténer) egy jelző beállításával GltfSaveOptions.

Lépésről lépésre útmutató

1. lépés: Telepítse az @aspose/3d csomagot

npm install @aspose/3d

Győződjön meg róla, hogy a Node.js 18 vagy újabb verziója aktív:

node --version   # must be >= 16.0.0

2. lépés: Importálja a Scene, GltfSaveOptions és GltfFormat osztályokat

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

GltfFormat a formátumleíró, amelyet átadnak scene.save(). GltfSaveOptions tartalmazza az összes export konfigurációt.

Ha forrásfájlt is betölt (pl. OBJ), importálja a megfelelő betöltési beállításokat:

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

3. lépés: Jelenet felépítése vagy betöltése

A opció: Betöltés egy meglévő fájlból (OBJ → GLB konverzió):

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());

B opció: Minimális jelenet programozott felépítése:

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

4. lépés: GltfSaveOptions konfigurálása

GltfSaveOptions vezérli a kimeneti formátumot és a kódolási részleteket.

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;

További beállítható opciók:

TulajdonságTípusAlapértelmezettHatás
binaryModebooleanfalsetrue → GLB, false → glTF JSON
flipTexCoordVbooleantrueUV függőleges tengelyének megfordítása a motor kompatibilitás érdekében

5. lépés: Mentés a scene.save() használatával

Addja meg a kimeneti útvonalat, a GltfFormat leírót, valamint a beállított opciókat:

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');

JSON előállításához .gltf fájl helyett:

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

6. lépés: Ellenőrizze a kimeneti fájlt

Ellenőrizze, hogy a kimeneti fájl létezik, és nem nulla méretű:

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');
}

A körutazás ellenőrzéséhez töltse újra a GLB-t, és ellenőrizze a csomópontok számát:

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`);

Gyakori problémák és megoldások

OBJ anyagfájl nem található az exportálás után OBJ-be mentéskor a scene.save('output.obj'), a .mtl az anyagfájl a … mellett kerül írásra .obj fájl automatikusan. Győződjön meg arról, hogy a kimeneti könyvtár írható, és hogy mindkét fájl együtt marad.

A kimeneti .glb kisebb, mint várható / a hálók hiányoznak Ha a betöltött jelenet olyan csomópontokkal rendelkezik, amelyeknek nincs entitása (pl. üres csoportok OBJ-ből), a GLB nem fogja tartalmazni ezeknek a csomópontoknak a geometriáját. Ellenőrizze, hogy a bemeneti fájl tényleges polygon adatokat tartalmaz-e a következő használatával mesh.controlPoints.length > 0 a mentés előtt.

Nem található a ‘@aspose/3d/formats/gltf’ modul Győződjön meg róla, hogy Node.js 18+ verziót használ, és hogy @aspose/3d telepítve van ugyanabban a node_modules mint a belépési pontja. Futtassa npm ls @aspose/3d a verzió 24.12.0 vagy újabb ellenőrzéséhez.

A GltfFormat.getInstance() undefined értéket ad vissza Ez verzióeltérést jelez a fő @aspose/3d csomag és egy gyorsítótárban lévő régebbi verzió között. Törölje node_modules és package-lock.json, majd futtassa npm install újra.

A textúrák hiányoznak a kimeneti GLB-ben Győződjön meg róla binaryMode = true be van állítva, hogy önálló GLB-t állítson elő. A glTF JSON kimenet esetén a textúra képfájloknak jelen kell lenniük a kimeneti fájl mellett, mivel relatív úton hivatkoznak rájuk.

Típushiba: A ‘GltfSaveOptions’ típusú argumentum nem rendelhető Biztosítsa, hogy mindkettő Scene és GltfSaveOptions azonos telepített csomagpéldányból legyen importálva. A vegyes telepítések (globális + helyi) felület-eltéréseket okozhatnak.

Gyakran Ismételt Kérdések (GYIK)

Mi a különbség a glTF és a GLB között? glTF 2.0 JSON (.gltf) a jelenetgrafikont ember által olvasható JSON fájlként tárolja, külön .bin puffer- és képfájlokkal. A GLB (.glb) mindent egyetlen bináris konténerbe csomagol. Állítsa be binaryMode = true GLB-hez, false JSON glTF-hez.

Exportálhatok olyan jelenetet, amely teljesen kódból lett felépítve (nincs forrásfájl)? Igen. Hozzon létre egy Scene, adjon hozzá Node objektumokat, csatoljon Mesh vagy más entitásokat, majd hívja scene.save(). A jelenetnek nem kell betöltött fájlból származnia.

A glTF export veszteségmentes? Geometriára és transzformációkra igen. Az anyagok a lehető legjobban a glTF PBR anyagtulajdonságokhoz vannak leképezve. A proprietárius FBX anyagkiterjesztések esetleg nem round‑trip tökéletesen.

Exportálhatok STL vagy 3MF formátumba helyette? Igen. A minta azonos; importáld a megfelelő formátumot *SaveOptions és *Format.getInstance():

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

A scene.save() aszinkron módon fut? Nem. scene.save() szinkron. Csomagold be egy worker szálba, ha el akarod kerülni az eseményciklus blokkolását nagy exportok során.

Mely Node.js verziók támogatottak? Node.js 18, 20 és 22+. A Node.js 16 és korábbi verziók nem támogatottak.

Lásd még

 Magyar