Sådan eksporterer du 3D‑scener til glTF/GLB i TypeScript
Aspose.3D FOSS understøtter glTF 2.0 både som import- og eksportformat. Det samme Scene-objekt kan udfyldes fra en OBJ-, FBX-, STL- eller anden kildefil og derefter skrives til .gltf (JSON + ekstern binær) eller .glb (enkelt binær container) ved at sætte en flag på GltfSaveOptions.
Trin-for-trin guide
Trin 1: Installer @aspose/3d
npm install @aspose/3dBekræft, at Node.js 18 eller nyere er aktiv:
node --version # must be >= 16.0.0Trin 2: Importér Scene, GltfSaveOptions og GltfFormat
import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';GltfFormat er formatbeskrivelsen, der sendes til scene.save(). GltfSaveOptions indeholder al eksportkonfiguration.
Hvis du også indlæser en kildefil (f.eks. OBJ), skal du importere de tilsvarende indlæsningsindstillinger:
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Trin 3: Byg eller indlæs en scene
Option A: Indlæs fra en eksisterende 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());Option B: Byg en minimal scene programmatisk:
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
Trin 4: Konfigurer GltfSaveOptions
GltfSaveOptions styrer outputformatet og kodningsdetaljerne.
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;Yderligere indstillinger, du kan angive:
| Egenskab | Type | Standard | Effekt |
|---|---|---|---|
binaryMode | boolean | false | true → GLB, false → glTF JSON |
flipTexCoordV | boolean | true | Vend UV-vertikalaksen for motor-kompatibilitet |
Trin 5: Gem ved at bruge scene.save()
Angiv outputstien, GltfFormat‑beskrivelsen og de konfigurerede indstillinger:
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');For at producere en JSON .gltf fil i stedet:
saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');Trin 6: Bekræft outputfilen
Kontroller, at outputfilen findes, og at den har en størrelse større end nul:
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');
}For en round‑trip‑verifikation, genindlæs GLB’en og inspicer nodeantallet:
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`);Almindelige problemer og rettelser
OBJ-materialfil ikke fundet efter eksport
Når du gemmer til OBJ via scene.save('output.obj'), skrives .mtl-materialfilen ved siden af .obj-filen automatisk. Sørg for, at outputmappen er skrivbar, og at begge filer holdes sammen.
Output .glb er mindre end forventet / mesh mangler
Hvis den indlæste scene har noder uden enheder (f.eks. tomme grupper fra en OBJ), vil GLB-filen ikke indeholde disse noders geometri. Bekræft, at din inputfil har faktiske polygondata ved hjælp af mesh.controlPoints.length > 0 før du gemmer.
Kan ikke finde modulet ‘@aspose/3d/formats/gltf’
Sørg for, at du bruger Node.js 18+ og at @aspose/3d er installeret i den samme node_modules som dit indgangspunkt. Kør npm ls @aspose/3d for at bekræfte, at versionen er 24.12.0 eller senere.
GltfFormat.getInstance() returnerer undefined
Dette indikerer en versionskonflikt mellem hoved @aspose/3d-pakken og en cachet ældre version. Slet node_modules og package-lock.json, og kør derefter npm install igen.
Teksturer mangler i den genererede GLB
Sørg for, at binaryMode = true er indstillet til at producere en selvstændig GLB. For glTF JSON-output skal teksturbilledfiler være til stede ved siden af outputfilen, da de refereres via relativ sti.
Typefejl: Argument af typen ‘GltfSaveOptions’ kan ikke tildeles
Sørg for, at både Scene og GltfSaveOptions importeres fra den samme installerede pakkeinstans. Blandet installation (global + lokal) kan forårsage grænseflade‑uoverensstemmelser.
Ofte stillede spørgsmål (FAQ)
Hvad er forskellen mellem glTF og GLB?
glTF 2.0 JSON (.gltf) gemmer scenegrafen som en menneskelæselig JSON-fil med separate .bin buffers og billedfiler. GLB (.glb) pakker alt i en enkelt binær container. Indstil binaryMode = true for GLB, false for JSON glTF.
Kan jeg eksportere en scene, der er bygget udelukkende i kode (ingen kildefil)?
Ja. Opret en Scene, tilføj Node objekter, vedhæft Mesh eller andre enheder, og kald derefter scene.save(). Scenen behøver ikke at stamme fra en indlæst fil.
Er glTF-eksporten tabsfri? For geometri og transformationer, ja. Materialer kortlægges til glTF PBR-materialeegenskaber, hvor det er muligt. Proprietære FBX-materialeudvidelser kan muligvis ikke round-trip perfekt.
Kan jeg eksportere til STL eller 3MF i stedet?
Ja. Mønstret er identisk; importer den tilsvarende formats *SaveOptions og *Format.getInstance():
import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);Kører scene.save() asynkront?
Nej. scene.save() er synkron. Pak den ind i en worker‑tråd, hvis du har brug for at undgå at blokere begivenhedsløkken under store eksporteringer.
Hvilke Node.js-versioner understøttes? Node.js 18, 20 og 22+. Node.js 16 og tidligere understøttes ikke.