Jak exportovat 3D scény do GLTF/GLB v TypeScript
Aspose.3D FOSS podporuje glTF 2.0 jak jako import, tak exportní formát. Scene objekt může být vyplněn z OBJ, FBX, STL nebo jiného zdrojového souboru a pak napsán do .gltf (JSON + externí binární) nebo .glb (jednotný binární kontejner) nastavením jedné značky na GltfSaveOptions.
Krok za krokem
Krok 1: Nainstalovat @aspose/3d
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
Potvrzení, že Node.js 18 nebo novější je aktivní:
node --version # must be >= 16.0.0Krok 2: Import Scene, GltfSaveOptions a GlltfFormat
import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';GltfFormat je deskriptor formátu přenesen do: scene.save(). GltfSaveOptions nese veškerou konfiguraci pro vývoz.
Pokud si také načítáte zdrojový soubor (např. OBJ), doveďte odpovídající možnosti načtení:
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Krok 3: Vytvořit nebo načíst scénu
Možnost A: Náklad z existujícího souboru (konverze 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žnost B: vytvořit minimální scénu programově.:
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: Konfigurovat funkce GltfSaveOptions
GltfSaveOptions ovládá výstupní formát a detaily kódování.
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;Další možnosti, které můžete nastavit:
| Vlastnictví | Typ: | Předvoleně | Účinek |
|---|---|---|---|
binaryMode | boolean | false | true → GLB, false → JSON s funkcí glTF |
flipTexCoordV | boolean | true | Vertikální osa UV-přepínání pro kompatibilitu motoru |
Krok 5: Uložení pomocí scény.save()
Projít výstupní cestu, GltfFormat Deskriptor a konfigurované 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');Vytvořit JSON .gltf místo toho soubor:
saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');Krok 6: Ověřte výstupní soubor
Zkontrolujte, zda výstupní soubor existuje a má velikost jinou než nula:
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');
}Pro ověření z cesty zpět a zpět znovu naložit GLB a kontrolovat počet uzlů:
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`);Obvyklé problémy a řešení
Soubor materiálů OBJ po vývozu nenašel. Při ukládání na OBJ prostřednictvím scene.save('output.obj'), v . .mtl materiální soubor je napsán vedle .obj Ověřte, zda je výstupní adresář zapsatelný a že jsou oba soubory vedeny společně.
Výstup .glb je menší než očekávalo / chybí sítě Pokud je v naložené scéně uzly bez entit (např. prázdné skupiny z OBJ), GLB neobsahuje geometrii těchto uzlů. Potvrďte, že vstupní soubor obsahuje skutečné údaje o polygoních pomocí mesh.controlPoints.length > 0 než zachráníte.
Nenašel modul “@aspose/3d/formats/gltf” Ujistěte se, že jste na Node.js 18+ a to @aspose/3d je instalován ve stejném zařízení. node_modules Jako vstupní bod. npm ls @aspose/3d potvrdit, že verze je 24.12.0 nebo novější.
GltfFormat.getInstance (() vrací undefined To naznačuje nesoulad verze mezi hlavními @aspose/3d balíček a starší verze v mezipaměti. node_modules a) package-lock.json, pak běž . npm install - Zase.
V výstupu GLB chybí textura. Zajištění: binaryMode = true je nastaven tak, aby produkoval samostatný GLB. Pro výstup JSON v rámci systému glTF musí být soubory s texturními obrázky přítomny vedle výstupu, protože jsou odkazem na relativní cestu.
Chyběj typu: Argument typu “GltfSaveOptions” nelze přiřadit. Zajistit obě. Scene a) GltfSaveOptions smíšené instalace (globální + místní) mohou způsobit nesoulad rozhraní.
Časté otázky (FAQ)
Jaký je rozdíl mezi glTF a GLB? glTF 2.0 JSON (.gltf) ukládá grafu scény jako lidsky čitelný soubor JSON s samostatným .bin Buffery a soubory snímků..glb) balí všechno do jednoho binárního kontejneru. binaryMode = true pro GLB, false pro JSON glTF.
Mohu exportovat scénu, která byla postavena zcela v kódu (bez zdrojového souboru)? Ano, vytvořit si… Scene, přidáme: Node předměty, připojit Mesh nebo jiným subjektům, pak zavolejte scene.save().Scéna nemusí pocházet z načteného souboru.
Je vývoz glTF bez ztrát? Pro geometrii a transformace ano. Materiály jsou v případě možností mapovány na vlastnosti materiálu glTF PBR. Vlastní rozšíření materiálů FBX nemusí být perfektně zpáteční.
Můžu exportovat na STL nebo 3MF? Ano, vzorec je stejný; import odpovídajícího formátu *SaveOptions a) *Format.getInstance():
import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);Je scéna.save asynchronní? - Ne, ne. - Cože?. scene.save() Je synchronní. Obalte ho do pracovního nitku, pokud se chcete vyhnout blokování smyčky událostí během velkého vývozu.
Jaké verze Node.js jsou podporovány? Node.js 18, 20, and 22+. Node.js 16 and earlier are not supported.