Kaip eksportuoti 3D scenas į glTF/GLB naudojant TypeScript

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/3d

Patikrinkite, 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ėTipasNumatytaPoveikis
binaryModebooleanfalsetrue → GLB, false → glTF JSON
flipTexCoordVbooleantrueApversti 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.

Žr. taip pat

 Lietuvių