TypeScript'te 3D Sahneleri glTF/GLB'ye Nasıl Dışa Aktarılır
Aspose.3D FOSS, glTF 2.0’ı hem içe aktarma hem de dışa aktarma formatı olarak destekler. Aynı Scene nesne, bir OBJ, FBX, STL veya başka bir kaynak dosyasından doldurulabilir ve ardından .gltf (JSON + harici ikili) veya .glb (tek ikili konteyner) bir bayrak ayarlayarak GltfSaveOptions.
Adım Adım Kılavuz
Adım 1: @aspose/3d’yi kurun
npm install @aspose/3dNode.js 18 veya daha yeni bir sürümün aktif olduğunu doğrulayın:
node --version # must be >= 16.0.0Adım 2: Scene, GltfSaveOptions ve GltfFormat’i içe aktarın
import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';GltfFormat format tanımlayıcısı, şuraya iletilir scene.save(). GltfSaveOptions tüm dışa aktarma yapılandırmasını taşır.
Eğer aynı zamanda bir kaynak dosya (ör. OBJ) yüklüyorsanız, eşleşen yükleme seçeneklerini içe aktarın:
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Adım 3: Bir sahne oluşturun veya yükleyin
Seçenek A: Mevcut bir dosyadan yükleyin (OBJ → GLB dönüşümü):
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());Seçenek B: Programatik olarak minimal bir sahne oluşturun:
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
Adım 4: GltfSaveOptions’ı yapılandırın
GltfSaveOptions çıktı formatını ve kodlama ayrıntılarını kontrol eder.
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;Ayarlayabileceğiniz ek seçenekler:
| Özellik | Tür | Varsayılan | Etki |
|---|---|---|---|
binaryMode | boolean | false | true → GLB, false → glTF JSON |
flipTexCoordV | boolean | true | Motor uyumluluğu için UV dikey eksenini ters çevir |
Adım 5: scene.save() kullanarak kaydedin
Çıktı yolunu, GltfFormat tanımlayıcıyı ve yapılandırılmış seçenekleri:
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');Bir JSON üretmek için .gltf dosya yerine:
saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');Adım 6: Çıktı dosyasını doğrula
Çıktı dosyasının mevcut olduğunu ve sıfırdan farklı bir boyuta sahip olduğunu kontrol edin:
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');
}Tam bir doğrulama için, GLB’yi yeniden yükleyin ve düğüm sayısını inceleyin:
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`);Yaygın Sorunlar ve Çözümler
OBJ malzeme dosyası dışa aktarma sonrası bulunamadı OBJ’ye aracılığıyla kaydederken scene.save('output.obj'), the .mtl malzeme dosyası yanına yazılır .obj dosya otomatik olarak. Çıktı dizininin yazılabilir olduğundan ve her iki dosyanın da birlikte tutulduğundan emin olun.
Çıktı .glb beklenenden daha küçük / ağlar eksik Yüklenen sahnede varlıkları olmayan düğümler varsa (ör. bir OBJ’den boş gruplar), GLB bu düğümlerin geometrisini içermeyecektir. Giriş dosyanızın gerçek çokgen verisine sahip olduğunu şunu kullanarak doğrulayın mesh.controlPoints.length > 0 kaydetmeden önce.
Modül ‘@aspose/3d/formats/gltf’ bulunamıyor Node.js 18+ sürümünde olduğunuzdan ve @aspose/3d aynı yerde kurulu olduğundan. node_modules giriş noktanız olarak. Şunu çalıştırın npm ls @aspose/3d sürümün 24.12.0 veya daha yeni olduğunu doğrulamak için.
GltfFormat.getInstance() undefined döndürüyor Bu, ana @aspose/3d paket ile önbellekteki eski sürüm arasında bir uyumsuzluk olduğunu gösterir. Şunu silin node_modules ve package-lock.json, ardından şunu çalıştırın npm install tekrar.
Çıktı GLB’sinde dokular eksik Emin olun binaryMode = true kendinden bağımsız bir GLB üretmek üzere ayarlanmıştır. glTF JSON çıktısı için, doku görüntü dosyalarının çıktı dosyasının yanında bulunması gerekir, çünkü bunlar göreceli yol ile referans alınır.
Tür hatası: ‘GltfSaveOptions’ tipinde argüman atanamıyor Her ikisinin de olduğundan emin olun Scene ve GltfSaveOptions aynı kurulu paket örneğinden içe aktarılmış olmalıdır. Karışık kurulumlar (global + yerel) arayüz uyumsuzluklarına neden olabilir.
Sıkça Sorulan Sorular (SSS)
glTF ile GLB arasındaki fark nedir? glTF 2.0 JSON (.gltf) sahne grafiğini insan tarafından okunabilir bir JSON dosyası olarak, ayrı .bin tamponlar ve görüntü dosyalarıyla saklar. GLB (.glb) her şeyi tek bir ikili konteynerde paketler. Ayarlayın binaryMode = true GLB için, false JSON glTF için.
Tamamen kod içinde oluşturulmuş bir sahneyi (kaynak dosya olmadan) dışa aktarabilir miyim? Evet. Bir Scene, ekleyin Node nesneleri, ekleyin Mesh veya diğer varlıkları, ardından çağırın scene.save(). Sahne, yüklü bir dosyadan gelmek zorunda değildir.
glTF dışa aktarımı kayıpsız mı? Geometri ve dönüşümler için evet. Malzemeler mümkün olduğunda glTF PBR malzeme özelliklerine eşlenir. Sahipli FBX malzeme uzantıları mükemmel bir şekilde geri dönüşüm sağlamayabilir.
Bunun yerine STL veya 3MF olarak dışa aktarabilir miyim? Evet. Desen aynı; ilgili formatı içe aktarın. *SaveOptions ve *Format.getInstance():
import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);scene.save() asenkron olarak çalışıyor mu? Hayır. scene.save() senkroniktir. Büyük dışa aktarımlarda olay döngüsünün engellenmesini önlemek istiyorsanız bir worker thread içinde sarın.
Hangi Node.js sürümleri destekleniyor? Node.js 18, 20 ve 22+. Node.js 16 ve öncekileri desteklenmiyor.