Jak exportovat 3D scény do GLTF/GLB v TypeScript

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.0

Krok 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
binaryModebooleanfalsetrue → GLB, false → JSON s funkcí glTF
flipTexCoordVbooleantrueVertiká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.

Viz také:

 Čeština