Kā eksportēt 3D ainas uz glTF/GLB TypeScript
Aspose.3D FOSS atbalsta glTF 2.0 kā gan importēšanas, gan eksportēšanas formātu. Tas pats Scene objekts var tikt aizpildīts no OBJ, FBX, STL vai cita avota faila un pēc tam ierakstīts uz .gltf (JSON + ārējs binārais) vai .glb (vienots binārais konteineris), iestatot vienu karogu uz GltfSaveOptions.
Solī pa solim ceļvedis
1. solis: Instalējiet @aspose/3d
npm install @aspose/3dPārliecinieties, ka ir aktīvs Node.js 18 vai jaunāks:
node --version # must be >= 16.0.02. solis: Importēt Scene, GltfSaveOptions un GltfFormat
import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';GltfFormat ir formāta deskriptors, kas tiek nodots scene.save(). GltfSaveOptions nes visus eksporta konfigurācijas iestatījumus.
Ja arī ielādējat avota failu (piemēram, OBJ), importējiet atbilstošās ielādes opcijas:
import { ObjLoadOptions } from '@aspose/3d/formats/obj';3. solis: Izveidot vai ielādēt ainu
Iespēja A: Ielādēt no esoša faila (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());Iespēja B: Programmatūrā izveidot minimālu ainu:
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
4. solis: Konfigurēt GltfSaveOptions
GltfSaveOptions kontrolē izvades formātu un kodēšanas detaļas.
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;Papildu iespējas, kuras varat iestatīt:
| Īpašība | Tips | Noklusējums | Ietekme |
|---|---|---|---|
binaryMode | boolean | false | true → GLB, false → glTF JSON |
flipTexCoordV | boolean | true | Apgriezt UV vertikālo asi, lai nodrošinātu saderību ar dzinēju |
5. solis: Saglabāt, izmantojot scene.save()
Padodiet izvades ceļu, GltfFormat deskriptoru un konfigurētās opcijas:
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');Lai izveidotu JSON .gltf fails tā vietā:
saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');6. solis: pārbaudiet izvades failu
Pārbaudiet, vai izvades fails pastāv un tam ir ne‑nulles izmērs:
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');
}Lai veiktu pilnīgu pārbaudi, pārlādējiet GLB un pārbaudiet mezglu skaitu:
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`);Biežāk sastopamās problēmas un risinājumi
OBJ materiāla fails nav atrasts pēc eksportēšanas Kad saglabā uz OBJ, izmantojot scene.save('output.obj'), tas .mtl materiāla fails tiek rakstīts blakus .obj fails automātiski. Pārliecinieties, ka izvades direktorija ir rakstāma un ka abi faili tiek turēti kopā.
Izvades .glb ir mazāks nekā gaidīts / tīkli trūkst Ja ielādētajai ainei ir mezgli bez entītijām (piemēram, tukši grupas no OBJ), GLB nesaturēs šo mezglu ģeometriju. Apstipriniet, ka jūsu ievades failā ir faktiski daudzstūru dati, izmantojot mesh.controlPoints.length > 0 pirms saglabāšanas.
Nevar atrast moduli ‘@aspose/3d/formats/gltf’ Pārliecinieties, ka izmantojat Node.js 18+ un ka @aspose/3d ir instalēts tajā pašā node_modules kā jūsu ieejas punkts. Izpildiet npm ls @aspose/3d lai pārliecinātos, ka versija ir 24.12.0 vai jaunāka.
GltfFormat.getInstance() atgriež undefined Tas norāda uz versiju neatbilstību starp galveno @aspose/3d pakotni un kešatmiņā saglabāto vecāku versiju. Izdzēsiet node_modules un package-lock.json, tad izpildiet npm install vēlreiz.
Tekstūras trūkst izvades GLB Nodrošiniet binaryMode = true ir iestatīts, lai radītu pašpietiekamu GLB. glTF JSON izvadei tekstūru attēlu faili jābūt pieejamiem blakus izvades failam, jo tie tiek atsaukti ar relatīvo ceļu.
Tipa kļūda: Argumenta tips ‘GltfSaveOptions’ nav piešķirams Pārliecinieties, ka abi Scene un GltfSaveOptions tiek importēti no tās pašas instalētās pakotnes instances. Sajauktas instalācijas (globāla + lokāla) var izraisīt saskarnes neatbilstības.
Biežāk uzdotie jautājumi (BUJ)
Kāda ir atšķirība starp glTF un GLB? glTF 2.0 JSON (.gltf) saglabā ainas grafu kā cilvēkam lasāmu JSON failu ar atsevišķiem .bin buferiem un attēlu failiem. GLB (.glb) pakot visus datus vienā binārajā konteinerā. Iestatiet binaryMode = true GLB gadījumā, false JSON glTF gadījumā.
Vai es varu eksportēt ainu, kas izveidota pilnīgi kodā (bez avota faila)? Jā. Izveidojiet a Scene, pievienojiet Node objektus, pievienojiet Mesh vai citus vienumus, tad izsauciet scene.save(). Aina nav jābūt izceltai no ielādēta faila.
Vai glTF eksportēšana ir bez zudumiem? Ģeometrijas un transformāciju gadījumā, jā. Materiāli tiek kartēti uz glTF PBR materiālu īpašībām, kur tas ir iespējams. Īpašas FBX materiālu paplašinājumi var nebūt pilnīgi atgriežami.
Vai es varu eksportēt uz STL vai 3MF? Jā. Paraugs ir identisks; importējiet atbilstošā formāta *SaveOptions un *Format.getInstance():
import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);Vai scene.save() darbojas asinhroni? Nē. scene.save() ir sinhrona. Ievietojiet to darbinieka pavedienā, ja jums jāizvairās no notikumu cilpas bloķēšanas lielu eksporta laikā.
Kādas Node.js versijas tiek atbalstītas? Node.js 18, 20 un 22+. Node.js 16 un agrākas versijas netiek atbalstītas.