Jak eksportować sceny 3D do glTF/GLB w typografie

Jak eksportować sceny 3D do glTF/GLB w typografie

Aspose.3D FOSS obsługuje glTF 2.0 jako format importu i eksportu. Scene Obiekt może być zamieszczony z pliku OBJ, FBX, STL lub innego źródła i następnie napisany do: .gltf (JSON + zewnętrzna binaria) lub .glb (jednorazowy kontener binarny) poprzez ustawienie jednej flagi na GltfSaveOptions.

Przewodnik krok po kroku

Krok 1: Instalacja @aspose/3d

asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.

Potwierdź, że Node.js 18 lub później jest aktywny:

node --version   # must be >= 16.0.0

Krok 2: Importowanie Sceny, GltfSaveOptions i GlTfFormat

import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';

GltfFormat Czy format opisujący został przekazany do scene.save(). GltfSaveOptions Wprowadza wszystkie konfiguracje eksportu.

Jeśli również pobierasz plik źródłowy (np. OBJ), wprowadź opcje dopasowania:

import { ObjLoadOptions } from '@aspose/3d/formats/obj';

Krok 3: Tworzenie lub ładowanie sceny

Opcja A: Pobierz z istniejącego pliku (OBJ → konwersja GLB):

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());

Opcja B: Zbuduj minimalną scenę programicznie:

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

Krok 4: Konfiguruj opcje GltfSave

GltfSaveOptions kontroluje format wyjścia i kodowanie szczegółów.

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;

Dodatkowe opcje można ustawić:

nieruchomościTypPodstawoweEfekty
binaryModebooleanfalsetrue → GLB, false Występuje GLTF JSON
flipTexCoordVbooleantrueFlip UV osi pionowej dla kompatybilności silnika

Krok 5: Zapisz za pomocą scene.save()

Przejdź drogą wyjścia, a GltfFormat Opcje i konfigurowane opcje:

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');

Aby wyprodukować JSON .gltf Zamiast tego plik:

saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');

Krok 6: Sprawdź plik wyjścia

Sprawdź, czy plik wyjściowy istnieje i ma rozmiar nie-zero:

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');
}

Aby uzyskać weryfikację w kierunku obrotu, ponownie pobierz GLB i sprawdź liczbę punktów:

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`);

Wspólne problemy i rozwiązania

Archiwum nie znaleziono po eksporcie Kiedy oszczędzać na OBJ poprzez scene.save('output.obj'), w tym .mtl Dokumenty są napisane obok .obj Upewnij się, że katalog wyjściowy jest pisalny i że oba pliki są przechowywane razem.

Wydajność .glb jest mniejsza niż oczekiwano / brakuje Jeśli naładowana scena ma węzły bez podmiotów (np. puste grupy z OBJ), GLB nie będzie zawierać geometrii tych wązłów. potwierdź, że plik wejściowy ma rzeczywiste dane poligonu za pomocą mesh.controlPoints.length > 0 Przed oszczędzaniem.

Nie można znaleźć modułu ‘@aspose/3d/formats/gltf’ Upewnij się, że jesteś na Node.js 18+ i to @aspose/3d Instalowany w tym samym miejscu node_modules jako punkt wejścia. biegać npm ls @aspose/3d Wersja jest 24.12.0 lub później.

GltfFormat.getInstance() zwraca się nieograniczony To wskazuje na nieporozumienie wersji między głównym @aspose/3d Pakiet i wersja starza. usunąć node_modules i package-lock.json,A potem biegać npm install znowu .

Brakuje tekstur w produkcji GLB Bezpieczeństwo binaryMode = true W przypadku wyjścia glTF JSON pliki obrazu tekstury muszą być obecne obok pliku wyjściowego, ponieważ są one odniesione przez relatywny ścieżkę.

błąd typu: argument typu “GltfSaveOptions” nie jest przypisywany Upewnij się, że obie Scene i GltfSaveOptions Zmieszane instalacje (global + lokalny) mogą powodować nieprawidłowe interfejsy.

Często zadawane pytania (FAQ)

Jaka jest różnica między GLTF a GLB? Wskaźnik GTS 2.0 (.gltf) przechowuje graf sceny jako ludzko czytelny plik JSON z oddzielnym .bin Wpisy i pliki z serii (WEB.glb- pakowanie wszystkiego w jednym pojemniku binarnym. binaryMode = true dla GLB, false W przypadku JSON GLTF.

Czy mogę eksportować scenę, która została zbudowana w całości w kodzie (bez pliku źródłowego)? Stwórz A Scene,Dodaj → Node Obiekty, przyczepy Mesh lub innych podmiotów, a następnie zadzwonić scene.save().Scena nie musi pochodzić z załadowanego pliku.

Czy GST jest bez strat? Dla geometrii i transformacji, tak. Materiały są mapowane do właściwości materiału glTF PBR gdzie to możliwe. Właściwe rozszerzenia materiał FBX nie mogą być w pełni okrągłe.

Czy mogę eksportować do STL lub 3MF zamiast tego? Wzór jest identyczny; import odpowiedniego formatu *SaveOptions i *Format.getInstance():

import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);

Czy scena.save() działa asynchronicznie? Nie . scene.save() Włóż go w pasek pracownika, jeśli musisz uniknąć blokowania przepływu wydarzeń podczas dużych eksportu.

Jakie wersje Node.js są obsługiwane? Node.js 18, 20 i 22+ nie są obsługiwane.

Zobacz również

 Polski