Sådan eksporterer du 3D‑scener til glTF/GLB i TypeScript

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

Bekræft, at Node.js 18 eller nyere er aktiv:

node --version   # must be >= 16.0.0

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

EgenskabTypeStandardEffekt
binaryModebooleanfalsetrue → GLB, false → glTF JSON
flipTexCoordVbooleantrueVend 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.

Se også

 Dansk