Kako izvesti 3D scene u glTF/GLB u TypeScript-u

Kako izvesti 3D scene u glTF/GLB u TypeScript-u

Aspose.3D FOSS podržava glTF 2.0 i kao format za uvoz i izvoz. Isti Scene objekat može biti popunjen iz OBJ, FBX, STL ili drugog izvornog fajla, a zatim zapisan u .gltf (JSON + eksterni 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 opis formata koji se prosleđuje scene.save(). GltfSaveOptions sadrži svu konfiguraciju izvoza.

Ako takođe učitavate izvorni fajl (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 (OBJ → GLB konverzija):

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: Izgradite minimalnu scenu programatski:

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: Konfigurišite GltfSaveOptions

GltfSaveOptions контролише формат излаза и детаље кодирања.

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:

SvojstvoTipPodrazumevanoEfekat
binaryModebooleanfalsetrue → GLB, false → glTF JSON
flipTexCoordVbooleantrueOkreni UV vertikalnu osu za kompatibilnost sa motorom

Korak 5: Sačuvajte pomoću scene.save()

Prosledite putanju izlaza, GltfFormat opisivač i konfigurisane 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');

Da biste umesto toga proizveli JSON .gltf fajl:

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

Korak 6: Proverite izlazni fajl

Proverite da izlazni fajl postoji i da ima nenultu veličinu:

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 verifikaciju povratnog puta, ponovo učitajte GLB i proverite 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 popravke

OBJ materialni fajl nije pronađen nakon izvoza
Pri čuvanju u OBJ putem scene.save('output.obj'), .mtl materialni fajl se automatski zapisuje pored .obj fajla. Proverite da je izlazni direktorijum upisiv i da su oba fajla zadržana zajedno.

Izlazni .glb je manji od očekivanog / nedostaju mreže
Ako učitana scena ima čvorove bez entiteta (npr. prazne grupe iz OBJ‑a), GLB neće sadržati geometriju tih čvorova. Potvrdite da vaš ulazni fajl sadrži stvarne poligonske podatke koristeći mesh.controlPoints.length > 0 pre nego što sačuvate.

Не могу да пронађем модул ‘@aspose/3d/formats/gltf’
Уверите се да користите Node.js 18+ и да је @aspose/3d инсталиран у истом node_modules као ваш улазни тачка. Покрените npm ls @aspose/3d да бисте потврдили да је верзија 24.12.0 или новија.

GltfFormat.getInstance() vraća undefined
Ovo ukazuje na neslaganje verzija između glavnog @aspose/3d paketa i keširane starije verzije. Obrišite node_modules i package-lock.json, zatim ponovo pokrenite npm install.

Teksture nedostaju u izlaznom GLB
Osigurajte da je binaryMode = true postavljen da proizvede samostalni GLB. Za glTF JSON izlaz, fajlovi slika tekstura moraju biti prisutni uz izlazni fajl jer se referenciraju relativnom putanjom.

Типска грешка: Аргумент типа ‘GltfSaveOptions’ није додељив
Осигурајте да су и Scene и GltfSaveOptions увезени из исте инсталиране инстанце пакета. Мешана инсталација (глобална + локална) може изазвати неслагања у интерфејсу.

Često postavljana pitanja (FAQ)

Koja je razlika između glTF i GLB? glTF 2.0 JSON (.gltf) čuva graf scene kao čitljiv JSON fajl sa odvojenim .bin baferima i slikovnim fajlovima. GLB (.glb) pakira sve u jedan binarni kontejner. Postavite binaryMode = true za GLB, false za JSON glTF.

Могу ли да извезем сцену која је у потпуности изграђена у коду (без изворног фајла)? Да. Креирајте Scene, додајте Node објекте, прикачите Mesh или друге ентитете, затим позовите scene.save(). Сцена не мора да потиче из учитаног фајла.

Da li je izvoz glTF bez gubitka?
Za geometriju i transformacije, da. Materijali se mapiraju na glTF PBR svojstva materijala gde je to moguće. Proprietarne FBX ekstenzije materijala možda neće savršeno da se vrate.

Могу ли да извезем у STL или 3MF уместо тога? Да. Шаблон је идентичан; увезите одговарајући формат *SaveOptions и *Format.getInstance():

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

Da li scene.save() radi asinhrono?
Ne. scene.save() je sinhrono. Umotajte ga u radni thread ako treba da izbegnete blokiranje event petlje tokom velikih izvoza.

Koje verzije Node.js su podržane? Node.js 18, 20 i 22+. Node.js 16 i starije nisu podržane.

Види такође

 Српски