Hur man exporterar 3D-scener till glTF/GLB i TypeScript
Aspose.3D FOSS stöder glTF 2.0 som både import- och exportformat. Scene objekt kan populeras från en OBJ, FBX, STL eller annan källfil och sedan skrivas till .gltf (JSON + extern binär) eller .glb (enbart binär container) genom att sätta en flagga på GltfSaveOptions.
Steg för steg guide
Steg 1: Installera @aspose/3d
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
Node.js 18 eller senare är aktiv:
node --version # must be >= 16.0.0Steg 2: Importera scen, GltfSaveOptions och GlfFormat
import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';GltfFormat är formatet beskrivare överfört till scene.save(). GltfSaveOptions Det är en exportkonfiguration.
Om du också laddar en källfil (t.ex. OBJ), importera matchande laddningsalternativ:
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Steg 3: Bygg eller ladda en scen
Alternativ A: Ladda ner från en befintlig fil (OBJ → GLB konvertering):
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());Alternativ B: Bygg en minimal scen programmatiskt:
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
Steg 4: Konfigurera GltfSaveOptions
GltfSaveOptions Kontrollera utgångsformat och kodning av detaljer.
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;Ytterligare alternativ du kan ställa in:
| Fastighet | Typ av | förfalskad | Effekt |
|---|---|---|---|
binaryMode | boolean | false | true → GLB, false Glyf JSON |
flipTexCoordV | boolean | true | Flip UV vertikal axel för motorkompatibilitet |
Steg 5: Spara med scene.save()
Passar utgångsvägen, den GltfFormat Beskrivning och de konfigurerade alternativen:
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');Att producera en JSON .gltf Fil istället för:
saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');Steg 6: Kontrollera utgångsfilen
Kontrollera att utgångsfilen finns och har en icke-zero storlek:
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');
}För en rundturskontroll ladda om GLB och kolla nötkonton:
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`);Vanliga problem och fixar
OBJ materialfilen inte hittad efter export När spara till OBJ via scene.save('output.obj'),och den .mtl materialet är skrivet tillsammans med .obj Se till att utgångsdirektivet är skrivet och att båda filerna sparas tillsammans.
Utgången .glb är mindre än förväntat / mässlor saknas Om den laddade scenen har noder utan enheter (t.ex. tomma grupper från ett OBJ), kommer GLB inte att innehålla dessa noders geometri. bekräfta din inmatningsfil har riktiga polygondata med hjälp av mesh.controlPoints.length > 0 innan spara.
Du kan inte hitta modulen ‘@aspose/3d/formats/gltf’ Se till att du är på Node.js 18+ och det @aspose/3d installeras i samma node_modules som din inresa. springa npm ls @aspose/3d För att bekräfta versionen är 24.12.0 eller senare.
GltfFormat.getInstance() returnerar inte definierad Detta indikerar en version mismatch mellan huvudsakliga @aspose/3d paket och en cached äldre version. radera node_modules och package-lock.json,Och sedan springa npm install Återigen .
Texturer saknas i produktionen GLB Säkerhet binaryMode = true För glTF JSON-utgången måste texturbildfiler vara närvarande bredvid utgångsfil eftersom de refereras av relativ väg.
Typfel: Argumentet av typen ‘GltfSaveOptions’ är inte tilldelbart Säkerställ båda Scene och GltfSaveOptions Blandade installationer (global + lokal) kan orsaka gränssnitt missmatch.
Ofta ställda frågor (FAQ)
Vad är skillnaden mellan GLTF och GLB? F1 2 JSON (.gltf) lagrar scenen graf som en mänskligt lästa JSON-fil med separat .bin Filer och bilder. gm (.glb) förpackar allt i en enda binär behållare. binaryMode = true för GLB, false För JSON gltf.
Kan jag exportera en scen som byggdes helt i kod (ingen källfil)? Ja, skapa en Scene,och add Node föremål, attach Mesh eller andra enheter, och sedan ringa scene.save().Scenen behöver inte komma från en laddad fil.
Är GST-exporten förlorad? För geometri och transformationer, ja. Materialet är kartläggat till glTF PBR materialegenskaper där det är möjligt. Egen FBX materialförlängningar kan inte runda-trip perfekt.
Kan jag exportera till STL eller 3MF istället? Ja. mönstret är identiskt; import motsvarande format *SaveOptions och *Format.getInstance():
import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);Är scenen.save() köras asynkroniskt? Nej inte. scene.save() är synkron. häll den i en arbetarråd om du behöver undvika att blockera händelsestänget under stora exporter.
Vilka Node.js-versioner stöds? Node.js 18, 20, och 22+. Noda.js 16 och tidigare stöds inte.