Kaip eksportuoti 3D scenas į glTF/GLB naudojant TypeScript
Aspose.3D FOSS palaiko glTF 2.0 tiek kaip importo, tiek kaip eksporto formatą. Tas pats Scene objektas gali būti užpildytas iš OBJ, FBX, STL arba kito šaltinio failo ir tada įrašytas į .gltf (JSON + išorinis binarinis) arba .glb (vienas binarinis konteineris) nustatant vieną vėliavą ant GltfSaveOptions.
Žingsnis po žingsnio vadovas
Žingsnis 1: Įdiekite @aspose/3d
npm install @aspose/3dPatikrinkite, ar veikia Node.js 18 arba naujesnė versija:
node --version # must be >= 16.0.0Žingsnis 2: Importuokite Scene, GltfSaveOptions ir GltfFormat
import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';GltfFormat yra formato deskriptorius, perduodamas į scene.save(). GltfSaveOptions neša visą eksporto konfigūraciją.
Jei taip pat įkeliate šaltinio failą (pvz., OBJ), importuokite atitinkamas įkėlimo parinktis:
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Žingsnis 3: Sukurkite arba įkelkite sceną
Parinktis A: Įkelti iš esamo failo (OBJ → GLB konversija):
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());Parinktis B: Programiškai sukurti minimalų sceną:
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
Žingsnis 4: Konfigūruokite GltfSaveOptions
GltfSaveOptions valdo išvesties formatą ir kodavimo detales.
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;Papildomos parinktys, kurias galite nustatyti:
| Savybė | Tipas | Numatyta | Poveikis |
|---|---|---|---|
binaryMode | boolean | false | true → GLB, false → glTF JSON |
flipTexCoordV | boolean | true | Apversti UV vertikalią ašį dėl variklio suderinamumo |
Žingsnis 5: Išsaugokite naudodami scene.save()
Pateikite išvesties kelią, GltfFormat deskriptorių ir sukonfigūruotas parinktys:
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');Generuoti JSON .gltf failas vietoj:
saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');Žingsnis 6: Patikrinkite išvesties failą
Patikrinkite, ar išvesties failas egzistuoja ir turi ne nulinį dydį:
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');
}Norėdami atlikti dvipusį patikrinimą, iš naujo įkelkite GLB ir patikrinkite mazgų skaičių:
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`);Dažnos problemos ir sprendimai
OBJ medžiagos failas nerastas po eksporto Kai išsaugoma į OBJ per scene.save('output.obj'), tai .mtl medžiagos failas rašomas šalia the .obj failas automatiškai. Įsitikinkite, kad išvesties katalogas yra rašomas ir kad abu failai laikomi kartu.
Išvesties .glb yra mažesnis nei tikėtasi / tinklų trūksta Jei įkelta scena turi mazgus be objektų (pvz., tuščias grupes iš OBJ), GLB nebus šių mazgų geometrijos. Patikrinkite, ar įvesties failas turi tikrų daugiakampių duomenų, naudodami mesh.controlPoints.length > 0 prieš išsaugant.
Negalima rasti modulio ‘@aspose/3d/formats/gltf’ Įsitikinkite, kad naudojate Node.js 18+ ir kad @aspose/3d yra įdiegtas toje pačioje node_modules kaip jūsų įėjimo taškas. Paleiskite npm ls @aspose/3d norėdami patvirtinti, kad versija yra 24.12.0 arba vėlesnė.
GltfFormat.getInstance() grąžina undefined Tai rodo, kad yra versijų nesutapimas tarp pagrindinio @aspose/3d paketo ir senesnės talpykloje esančios versijos. Ištrinkite node_modules ir package-lock.json, tada vykdykite npm install vėl.
Išvesties GLB trūksta tekstūrų Užtikrinkite binaryMode = true nustatytas generuoti savarankišką GLB. glTF JSON išvesties atveju tekstūrų vaizdo failai turi būti kartu su išvesties failu, nes jie yra nurodyti santykiniais keliais.
Tipo klaida: Argumentas tipo ‘GltfSaveOptions’ nėra priskiriamas Užtikrinkite, kad abu Scene ir GltfSaveOptions yra importuojami iš tos pačios įdiegtos paketo egzemplioriaus. Mišrių įdiegimų (global + local) kombinacija gali sukelti sąsajos neatitikimus.
Dažnai užduodami klausimai (DUK)
Kuo skiriasi glTF ir GLB? glTF 2.0 JSON (.gltf) saugo scenos grafiką kaip žmogui skaitomą JSON failą su atskirais .bin buferiais ir paveikslų failais. GLB (.glb) supakuoja viską į vieną binarinį konteinerį. Nustatykite binaryMode = true GLB atveju, false JSON glTF atveju.
Ar galiu eksportuoti sceną, kuri buvo visiškai sukurta kode (be šaltinio failo)? Taip. Sukurkite Scene, pridėkite Node objektus, prisegti Mesh arba kitus objektus, tada iškvieskite scene.save(). Scena neturi būti kilusi iš įkelto failo.
Ar glTF eksportas yra be nuostolių? Dėl geometrijos ir transformacijų – taip. Medžiagos susiejamos su glTF PBR medžiagų savybėmis, kai įmanoma. Nuosavybiniai FBX medžiagų plėtiniai gali nevisiškai tiksliai grįžti atgal.
Ar galiu vietoj to eksportuoti į STL arba 3MF? Taip. Šablonas yra identiškas; importuokite atitinkamo formato *SaveOptions ir *Format.getInstance():
import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);Ar scene.save() veikia asinchroniškai? Ne. scene.save() yra sinchroninis. Įdėkite jį į worker thread, jei reikia išvengti įvykio ciklo blokavimo didelių eksporto metu.
Kokios Node.js versijos palaikomos? Node.js 18, 20 ir 22+. Node.js 16 ir ankstesnės versijos nepalaikomos.