Kuinka viedä 3D‑kohtaukset glTF/GLB-muotoon TypeScriptissä
Aspose.3D FOSS tukee glTF 2.0 -formaattia sekä tuonti- että vientimuodossa. Sama Scene-objekti voidaan täyttää OBJ-, FBX-, STL- tai muusta lähdetiedostosta ja sen jälkeen kirjoittaa .gltf (JSON + ulkoinen binaari) tai .glb (yksi binaarinen säiliö) asettamalla yksi lippu GltfSaveOptions.
Vaiheittainen opas
Vaihe 1: Asenna @aspose/3d
npm install @aspose/3dVahvista, että Node.js 18 tai uudempi on aktiivinen:
node --version # must be >= 16.0.0Vaihe 2: Tuo Scene, GltfSaveOptions ja GltfFormat
import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';GltfFormat on formaattikuvaus, joka välitetään scene.save():lle. GltfSaveOptions sisältää kaikki vientiasetukset.
Jos lataat myös lähdetiedoston (esim. OBJ), tuo vastaavat latausasetukset:
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Vaihe 3: Rakenna tai lataa kohtaus
Vaihtoehto A: Lataa olemassa olevasta tiedostosta (OBJ → GLB -muunnos):
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());Vaihtoehto B: Rakenna minimaalinen kohtaus ohjelmallisesti:
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
Vaihe 4: Määritä GltfSaveOptions
GltfSaveOptions ohjaa tulostusformaattia ja koodausyksityiskohtia.
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;Lisäasetuksia, jotka voit asettaa:
| Ominaisuus | Tyyppi | Oletus | Vaikutus |
|---|---|---|---|
binaryMode | boolean | false | true → GLB, false → glTF JSON |
flipTexCoordV | boolean | true | Käännä UV:n pystyakseli moottorin yhteensopivuuden vuoksi |
Vaihe 5: Tallenna käyttämällä scene.save()
Anna lähtöpolku, GltfFormat-kuvaus ja määritetyt asetukset:
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');Tuottaaksesi JSON .gltf -tiedoston sen sijaan:
saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');Vaihe 6: Vahvista tulostiedosto
Tarkista, että tulostetiedosto on olemassa eikä sen koko ole nolla:
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');
}Pyöräilymatkan vahvistamiseksi lataa GLB uudelleen ja tarkista solmujen määrä:
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`);Yleiset ongelmat ja korjaukset
OBJ-materiaali tiedostoa ei löydy viennin jälkeen
Kun tallennat OBJ-muotoon scene.save('output.obj'), .mtl-materiaalitiedosto kirjoitetaan automaattisesti .obj-tiedoston rinnalle. Varmista, että tulostushakemisto on kirjoitettavissa ja että molemmat tiedostot pidetään yhdessä.
Output .glb on pienempi kuin odotettu / verkot puuttuvat
Jos ladatussa kohtauksessa on solmuja ilman entiteettejä (esim. tyhjät ryhmät OBJ‑tiedostosta), GLB‑tiedosto ei sisällä näiden solmujen geometriaa. Vahvista, että syötetiedostossa on todellista polygonidata käyttämällä mesh.controlPoints.length > 0 ennen tallentamista.
Moduulia ‘@aspose/3d/formats/gltf’ ei löydy
Varmista, että käytät Node.js 18+ -versiota ja että @aspose/3d on asennettu samaan node_modules kuin sisäänkäyntipisteesi. Suorita npm ls @aspose/3d vahvistaaksesi, että versio on 24.12.0 tai uudempi.
GltfFormat.getInstance() palauttaa undefined
Tämä osoittaa versioristiriidan pääpaketin @aspose/3d ja välimuistissa olevan vanhemman version välillä. Poista node_modules ja package-lock.json, ja suorita sitten npm install uudelleen.
Tekstuurit puuttuvat tulostetusta GLB:stä
Varmista, että binaryMode = true on asetettu tuottamaan itsenäinen GLB. glTF JSON -tulosteessa tekstuurikuvatiedostojen on oltava samassa kansiossa tulostetiedoston kanssa, koska ne viittaavat suhteelliseen polkuun.
Tyyppivirhe: Argumentin tyyppi ‘GltfSaveOptions’ ei ole sijoitettavissa
Varmista, että sekä Scene että GltfSaveOptions on tuotu samasta asennetusta pakettiversiosta. Sekalaiset asennukset (globaali + paikallinen) voivat aiheuttaa käyttöliittymävirheitä.
Usein kysytyt kysymykset (UKK)
Mikä on glTF:n ja GLB:n ero?
glTF 2.0 JSON (.gltf) tallentaa kohtausgraafin luettavana JSON‑tiedostona erillisillä .bin puskuritiedostoilla ja kuvatiedostoilla. GLB (.glb) pakkaa kaiken yhteen binaariseen konttiin. Aseta binaryMode = true GLB:lle, false JSON glTF:lle.
Voinko viedä kohtauksen, joka on rakennettu kokonaan koodilla (ei lähdetiedostoa)?
Kyllä. Luo Scene, lisää Node-objekteja, liitä Mesh tai muita entiteettejä, ja kutsu sitten scene.save(). Kohtaus ei tarvitse olla peräisin ladatusta tiedostosta.
Onko glTF‑vienti häviötön? Geometriassa ja muunnoksissa kyllä. Materiaalit kartoitetaan glTF:n PBR‑materiaaliominaisuuksiin mahdollisuuksien mukaan. Omistusoikeudelliset FBX‑materiaalilaajennukset eivät välttämättä pyöri täydellisesti.
Voinko viedä STL- tai 3MF-muodossa sen sijaan?
Kyllä. Malli on identtinen; tuo vastaavan formaatin *SaveOptions ja *Format.getInstance():
import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);Suoritetaanko scene.save() asynkronisesti?
Ei. scene.save() on synkroninen. Kääri se työntekijäsäikeeseen, jos sinun täytyy välttää tapahtumasilmukan estäminen suurten vientien aikana.
Mitä Node.js‑versioita tuetaan? Node.js 18, 20 ja 22+. Node.js 16 ja aikaisemmat eivät ole tuettuja.