Wie man 3D‑Szenen in TypeScript nach glTF/GLB exportiert
Aspose.3D FOSS unterstützt glTF 2.0 sowohl als Import- als auch als Exportformat. Das gleiche Scene Objekt kann aus einer OBJ-, FBX-, STL- oder anderen Quelldatei befüllt und anschließend geschrieben werden nach .gltf (JSON + externe Binärdatei) oder .glb (einzelner Binärcontainer) durch Setzen eines Flags auf GltfSaveOptions.
Schritt-für-Schritt-Anleitung
Schritt 1: @aspose/3d installieren
npm install @aspose/3dStellen Sie sicher, dass Node.js 18 oder höher aktiv ist:
node --version # must be >= 16.0.0Schritt 2: Importieren von Scene, GltfSaveOptions und GltfFormat
import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';GltfFormat ist der Format-Deskriptor, der an scene.save(). GltfSaveOptions enthält die gesamte Exportkonfiguration.
Wenn Sie außerdem eine Quelldatei laden (z. B. OBJ), importieren Sie die passenden Ladeoptionen:
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Schritt 3: Erstellen oder Laden einer Szene
Option A: Laden aus einer vorhandenen Datei (OBJ → GLB‑Konvertierung):
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: Programmatisches Erstellen einer minimalen Szene:
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
Schritt 3: (Optional) GltfSaveOptions verwenden
GltfSaveOptions steuert das Ausgabeformat und die Kodierungsdetails.
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;Zusätzliche Optionen, die Sie setzen können:
| Eigenschaft | Typ | Standard | Effekt |
|---|---|---|---|
binaryMode | boolean | false | true → GLB, false → glTF JSON |
flipTexCoordV | boolean | true | UV-Vertikalachse umkehren für Engine‑Kompatibilität |
Schritt 5: Speichern mit scene.save()
Gib den Ausgabepfad, die GltfFormat Deskriptor und die konfigurierten Optionen:
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');Um ein JSON .gltf Datei stattdessen:
saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');Schritt 6: Überprüfen der Ausgabedatei
Prüfen Sie, ob die Ausgabedatei existiert und eine Größe ungleich Null hat:
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 eine Round‑Trip‑Verifizierung laden Sie das GLB erneut und prüfen die Knotenzahl:
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`);Häufige Probleme und Lösungen
OBJ-Materialdatei nach dem Export nicht gefunden Beim Speichern nach OBJ über scene.save('output.obj'), die .mtl Materialdatei wird zusammen mit der .obj Datei automatisch. Stellen Sie sicher, dass das Ausgabeverzeichnis beschreibbar ist und dass beide Dateien zusammengehalten werden.
Ausgabe .glb ist kleiner als erwartet / Meshes fehlen Wenn die geladene Szene Knoten ohne Entitäten enthält (z. B. leere Gruppen aus einer OBJ), wird das GLB die Geometrie dieser Knoten nicht enthalten. Bestätigen Sie, dass Ihre Eingabedatei tatsächliche Polygon‑Daten enthält, indem Sie mesh.controlPoints.length > 0 vor dem Speichern.
Modul ‘@aspose/3d/formats/gltf’ kann nicht gefunden werden Stellen Sie sicher, dass Sie Node.js 18+ verwenden und dass @aspose/3d im selben node_modules wie Ihr Einstiegspunkt installiert ist. Führen Sie npm ls @aspose/3d aus, um zu bestätigen, dass die Version 24.12.0 oder neuer ist.
GltfFormat.getInstance() gibt undefined zurück Dies weist auf eine Versionsinkompatibilität zwischen dem Haupt- @aspose/3d Paket und einer zwischengespeicherten älteren Version hin. Löschen Sie node_modules und package-lock.json, dann ausführen npm install erneut.
Texturen fehlen im ausgegebenen GLB Stellen Sie sicher binaryMode = true ist so eingestellt, dass ein eigenständiges GLB erzeugt wird. Für glTF JSON-Ausgabe müssen die Texturbilddateien neben der Ausgabedatei vorhanden sein, da sie über relative Pfade referenziert werden.
Typfehler: Argument vom Typ ‘GltfSaveOptions’ ist nicht zuweisbar Stellen Sie sicher, dass beide Scene und GltfSaveOptions aus derselben installierten Paketinstanz importiert werden. Gemischte Installationen (global + lokal) können zu Schnittstelleninkompatibilitäten führen.
Häufig gestellte Fragen (FAQ)
Was ist der Unterschied zwischen glTF und GLB? glTF 2.0 JSON (.gltf) speichert den Szenengraphen als menschenlesbare JSON-Datei mit separaten .bin Puffer und Bilddateien. GLB (.glb) packt alles in einen einzigen Binärcontainer. Set binaryMode = true für GLB, false für JSON glTF.
Kann ich eine Szene exportieren, die vollständig im Code erstellt wurde (keine Quelldatei)? Ja. Erstelle ein Scene, füge Node Objekte, hänge an Mesh oder andere Entitäten, dann rufe scene.save(). Die Szene muss nicht aus einer geladenen Datei stammen.
Ist der glTF-Export verlustfrei? Für Geometrie und Transformationen, ja. Materialien werden, wo möglich, auf glTF PBR-Materialeigenschaften abgebildet. Proprietäre FBX-Materialerweiterungen können möglicherweise nicht perfekt round‑trip‑fähig sein.
Kann ich stattdessen nach STL oder 3MF exportieren? Ja. Das Muster ist identisch; importiere das entsprechende Format‑ *SaveOptions und *Format.getInstance():
import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);Wird scene.save() asynchron ausgeführt? Nein. scene.save() ist synchron. Wickele es in einen Worker‑Thread, wenn du das Blockieren der Ereignisschleife bei großen Exporten vermeiden musst.
Welche Node.js-Versionen werden unterstützt? Node.js 18, 20 und 22+. Node.js 16 und früher werden nicht unterstützt.