Kuinka viedä 3D‑kohtaukset glTF/GLB-muotoon TypeScriptissä

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

Vahvista, että Node.js 18 tai uudempi on aktiivinen:

node --version   # must be >= 16.0.0

Vaihe 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:

OminaisuusTyyppiOletusVaikutus
binaryModebooleanfalsetrue → GLB, false → glTF JSON
flipTexCoordVbooleantrueKää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.

Katso myös

 Suomi