Ako exportovať 3D scény do glTF/GLB v TypeScript
Aspose.3D FOSS podporuje glTF 2.0 ako importný aj exportný formát. Rovnaký Scene objekt môže byť naplnený z OBJ, FBX, STL alebo iného zdrojového súboru a potom zapísaný do .gltf (JSON + externý binárny) alebo .glb (jediný binárny kontajner) nastavením jedného príznaku na GltfSaveOptions.
Postupný návod
Krok 1: Nainštalujte @aspose/3d
npm install @aspose/3dPotvrďte, že je aktívny Node.js 18 alebo novší:
node --version # must be >= 16.0.0Krok 2: Importujte Scene, GltfSaveOptions a GltfFormat
import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';GltfFormat je deskriptor formátu odovzdaný scene.save(). GltfSaveOptions nesie všetku konfiguráciu exportu.
Ak tiež načítavate zdrojový súbor (napr. OBJ), importujte zodpovedajúce možnosti načítania:
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Krok 3: Vytvorte alebo načítajte scénu
Možnosť A: Načítanie z existujúceho súboru (konverzia 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());Možnosť B: Programaticky vytvoriť minimálnu scénu:
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
Krok 4: Nakonfigurujte GltfSaveOptions
GltfSaveOptions riadi výstupný formát a podrobnosti kódovania.
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;Ďalšie možnosti, ktoré môžete nastaviť:
| Vlastnosť | Typ | Predvolené | Efekt |
|---|---|---|---|
binaryMode | boolean | false | true → GLB, false → glTF JSON |
flipTexCoordV | boolean | true | Preklopiť vertikálnu os UV pre kompatibilitu s engine |
Krok 5: Uložte pomocou scene.save()
Zadajte výstupnú cestu, GltfFormat deskriptor a nakonfigurované možnosti:
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');Na vytvorenie JSON .gltf súbor namiesto:
saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');Krok 6: Overte výstupný súbor
Skontrolujte, či výstupný súbor existuje a má nenulovú veľkosť:
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');
}Pre overenie celého cyklu načítajte GLB znova a skontrolujte počet uzlov:
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`);Bežné problémy a riešenia
OBJ materiálový súbor nebol nájdený po exporte Pri ukladaní do OBJ cez scene.save('output.obj'), the .mtl súbor materiálu je zapísaný vedľa the .obj súbor automaticky. Uistite sa, že výstupný adresár je zapisovateľný a že oba súbory zostanú spolu.
Výstupný .glb je menší, než sa očakávalo / chýbajú meshe Ak načítaná scéna má uzly bez entít (napr. prázdne skupiny z OBJ), GLB nebude obsahovať geometriu týchto uzlov. Potvrďte, že váš vstupný súbor obsahuje skutočné polygonové dáta pomocou mesh.controlPoints.length > 0 pred uložením.
Nemožno nájsť modul ‘@aspose/3d/formats/gltf’ Uistite sa, že používate Node.js 18+ a že @aspose/3d je nainštalovaný v rovnakom node_modules ako váš vstupný bod. Spustite npm ls @aspose/3d na potvrdenie, že verzia je 24.12.0 alebo novšia.
GltfFormat.getInstance() vracia undefined Toto naznačuje nezhodu verzií medzi hlavnou @aspose/3d balíkom a uloženou staršou verziou. Odstráňte node_modules a package-lock.json, potom spustite npm install znova.
Textúry chýbajú v výstupnom GLB Uistite sa binaryMode = true je nastavené tak, aby vytvorilo samostatný GLB. Pre výstup glTF JSON musia byť súbory s textúrami prítomné vedľa výstupného súboru, pretože sú odkazované relatívnou cestou.
Chyba typu: Argument typu ‘GltfSaveOptions’ nie je priraditeľný Uistite sa, že oba Scene a GltfSaveOptions sú importované z rovnakej nainštalovanej inštancie balíka. Zmiešané inštalácie (globálne + lokálne) môžu spôsobiť nezhody rozhraní.
Často kladené otázky (FAQ)
Aký je rozdiel medzi glTF a GLB? glTF 2.0 JSON (.gltf) ukladá graf scény ako ľahko čitateľný JSON súbor s oddelenými .bin buffermi a súbormi obrázkov. GLB (.glb) zabalí všetko do jedného binárneho kontajnera. Nastavte binaryMode = true pre GLB, false pre JSON glTF.
Môžem exportovať scénu, ktorá bola postavená výlučne v kóde (bez zdrojového súboru)? Áno. Vytvorte Scene, pridajte Node objekty, pripojte Mesh alebo iné entity, potom zavolajte scene.save(). Scéna nemusí pochádzať z načítaného súboru.
Je export glTF bezstratový? Pre geometriu a transformácie, áno. Materiály sú mapované na vlastnosti materiálu glTF PBR, kde je to možné. Proprietárne rozšírenia materiálov FBX nemusia dokonale prejsť tam a späť.
Môžem namiesto toho exportovať do STL alebo 3MF? Áno. Vzor je identický; importujte príslušný formát. *SaveOptions a *Format.getInstance():
import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);Spúšťa sa scene.save() asynchrónne? Nie. scene.save() je synchronný. Zabaľte ho do pracovného vlákna, ak potrebujete zabrániť blokovaniu event loopu počas veľkých exportov.
Ktoré verzie Node.js sú podporované? Node.js 18, 20 a 22+. Node.js 16 a staršie nie sú podporované.