Cara Mengeksport Adegan 3D ke glTF/GLB dalam TypeScript
Aspose.3D FOSS menyokong glTF 2.0 sebagai format import dan eksport. Objek Scene yang sama boleh dipenuhi daripada fail OBJ, FBX, STL, atau sumber lain dan kemudian ditulis ke .gltf (JSON + binari luaran) atau .glb (bekas binari tunggal) dengan menetapkan satu bendera pada GltfSaveOptions.
Panduan Langkah demi Langkah
Langkah 1: Pasang @aspose/3d
npm install @aspose/3dSahkan Node.js 18 atau versi lebih baru sedang aktif:
node --version # must be >= 16.0.0Langkah 2: Import Scene, GltfSaveOptions, dan GltfFormat
import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';GltfFormat ialah penerangan format yang dihantar kepada scene.save(). GltfSaveOptions membawa semua konfigurasi eksport.
Jika anda juga memuatkan fail sumber (contohnya, OBJ), import pilihan muat yang sepadan:
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Langkah 3: Bina atau muatkan satu adegan
Pilihan A: Muat dari fail sedia ada (penukaran OBJ → 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());Pilihan B: Bina adegan minimum secara programatik:
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
Langkah 4: Konfigurasikan GltfSaveOptions
GltfSaveOptions mengawal format output dan butiran pengekodan.
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;Pilihan tambahan yang boleh anda tetapkan:
| Sifat | Jenis | Lalai | Kesan |
|---|---|---|---|
binaryMode | boolean | false | true → GLB, false → glTF JSON |
flipTexCoordV | boolean | true | Balik paksi menegak UV untuk keserasian enjin |
Langkah 5: Simpan menggunakan scene.save()
Berikan laluan output, penerang GltfFormat, dan pilihan yang dikonfigurasikan:
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');Untuk menghasilkan fail JSON .gltf sebagai gantinya:
saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');Langkah 6: Sahkan fail output
Semak bahawa fail output wujud dan mempunyai saiz bukan sifar:
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');
}Untuk pengesahan pusingan balik, muat semula GLB dan periksa kiraan nod:
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`);Isu Umum dan Penyelesaian
OBJ material file not found after export
Apabila menyimpan ke OBJ melalui scene.save('output.obj'), fail bahan .mtl ditulis bersama fail .obj secara automatik. Pastikan direktori output boleh ditulis dan kedua‑dua fail disimpan bersama.
Output .glb lebih kecil daripada yang dijangka / mesh tidak muncul
Jika adegan yang dimuatkan mempunyai nod tanpa entiti (contohnya, kumpulan kosong daripada OBJ), GLB tidak akan mengandungi geometri nod tersebut. Sahkan fail input anda mempunyai data polygon sebenar menggunakan mesh.controlPoints.length > 0 sebelum menyimpan.
Tidak dapat menemui modul ‘@aspose/3d/formats/gltf’
Pastikan anda berada pada Node.js 18+ dan @aspose/3d dipasang dalam node_modules yang sama dengan titik masuk anda. Jalankan npm ls @aspose/3d untuk mengesahkan versi ialah 24.12.0 atau lebih baru.
GltfFormat.getInstance() mengembalikan undefined
Ini menunjukkan ketidakcocokan versi antara pakej utama @aspose/3d dan versi lama yang disimpan dalam cache. Padam node_modules dan package-lock.json, kemudian jalankan npm install sekali lagi.
Tekstur tidak muncul dalam GLB output
Pastikan binaryMode = true ditetapkan untuk menghasilkan GLB yang berdiri sendiri. Untuk output JSON glTF, fail imej tekstur mesti berada bersama fail output kerana ia dirujuk melalui laluan relatif.
Ralat jenis: Argumen jenis ‘GltfSaveOptions’ tidak dapat ditetapkan
Pastikan kedua Scene dan GltfSaveOptions diimport dari contoh pakej yang dipasang yang sama. Pemasangan campuran (global + tempatan) boleh menyebabkan ketidakcocokan antara muka.
Soalan Lazim (FAQ)
Apakah perbezaan antara glTF dan GLB?
glTF 2.0 JSON (.gltf) menyimpan graf adegan sebagai fail JSON yang boleh dibaca manusia dengan penimbal .bin dan fail imej berasingan. GLB (.glb) membungkus semuanya ke dalam satu kontena binari. Tetapkan binaryMode = true untuk GLB, false untuk JSON glTF.
Bolehkah saya mengeksport adegan yang dibina sepenuhnya dalam kod (tiada fail sumber)?
Ya. Cipta Scene, tambahkan objek Node, lampirkan Mesh atau entiti lain, kemudian panggil scene.save(). Adegan tidak perlu berasal daripada fail yang dimuatkan.
Adakah eksport glTF tanpa kehilangan?
Untuk geometri dan transformasi, ya. Bahan dipetakan ke sifat bahan glTF PBR bila boleh. Sambungan bahan FBX proprietari mungkin tidak dapat dipulangkan dengan sempurna.
Bolehkah saya mengeksport ke STL atau 3MF sebagai gantinya?
Ya. Coraknya serupa; import format yang sepadan *SaveOptions dan *Format.getInstance():
import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);Adakah scene.save() dijalankan secara asynchronous?
Tidak. scene.save() adalah synchronous. Balutkan dalam worker thread jika anda perlu mengelakkan blok pada event loop semasa eksport besar.
Apakah versi Node.js yang disokong? Node.js 18, 20, dan 22+. Node.js 16 dan versi sebelumnya tidak disokong.