TypeScript'te 3D Modelleri Nasıl Yüklenir
Bu @aspose/3d paket, TypeScript ve Node.js uygulamalarına 3D sahne dosyalarını açmak için basit bir API sağlar. Scene kök nesnedir: çağırın scene.open() bir dosya yolu ve isteğe bağlı format‑spesifik yükleme seçenekleriyle, ardından dolaşın scene.rootNode geometri, materyaller ve dönüşümlere erişmek için.
Adım Adım Kılavuz
Adım 1: @aspose/3d paketini npm üzerinden kurun
Paketi projenize ekleyin. Yerel ikili dosyalar veya platform‑spesifik derleme araçları gerekmez; sadece Node.js 18 veya üzeri gerekir.
npm install @aspose/3dTypeScript projeleri için tip tanımları paketle birlikte gelir:
##tsconfig.json: minimum required settings
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true
}
}Adım 2: Scene ve format‑spesifik seçenekleri içe aktarın
Her format, kendi yükleyici sınıfını ve seçenek nesnesini bir alt yol altında sunar. Sadece ihtiyacınız olanı içe aktarın:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Diğer formatlar için desen aynı şekildedir:
import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';Adım 3: scene.open() kullanarak bir 3D dosyası açın
Bir oluşturun Scene örnek, ardından çağırın scene.open() dosya yolu ve isteğe bağlı bir load-options nesnesiyle. Çağrı eşzamanlıdır.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;
scene.open('model.obj', options);
console.log('Scene loaded successfully');Bir’ den yüklemek için Buffer zaten bellekte (sunucusuz veya akış bağlamlarında faydalı):
import * as fs from 'fs';
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const buffer = fs.readFileSync('model.obj');
const scene = new Scene();
scene.openFromBuffer(buffer, new ObjLoadOptions());Adım 4: sahne düğümlerinde yineleme yapın
Sahne grafiği, şurada köklenen bir ağaçtır scene.rootNode. Node çocuk düğümler ve isteğe bağlı bir entity (mesh, kamera, ışık, vb.).
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
function visitNode(node: any, depth: number = 0): void {
const indent = ' '.repeat(depth);
console.log(`${indent}Node: ${node.name}`);
if (node.entity) {
console.log(`${indent} Entity type: ${node.entity.constructor.name}`);
}
for (const child of node.childNodes) {
visitNode(child, depth + 1);
}
}
visitNode(scene.rootNode);Adım 5: controlPoints aracılığıyla mesh köşe verilerine erişin
Bir düğümün varlığı bir Mesh, ham kontrol noktalarını (köşeleri) şuradan okuyabilirsiniz controlPoints dizi. Her giriş bir Vector4 ile x, y, z, ve w bileşenler.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
for (const node of scene.rootNode.childNodes) {
if (!node.entity) continue;
const entity = node.entity;
// Check if the entity is a Mesh by duck-typing controlPoints
if ('controlPoints' in entity) {
const mesh = entity as any;
console.log(`Mesh "${node.name}": ${mesh.controlPoints.length} vertices`);
// Print first three vertices
for (let i = 0; i < Math.min(3, mesh.controlPoints.length); i++) {
const v = mesh.controlPoints[i];
console.log(` v[${i}]: x=${v.x.toFixed(4)}, y=${v.y.toFixed(4)}, z=${v.z.toFixed(4)}`);
}
}
}Adım 6: malzeme yüklemesi için ObjLoadOptions’ı yapılandırın
ObjLoadOptions eşlik eden dosyaların ve dokuların nasıl çözüleceğini kontrol eden özellikleri ortaya çıkar. .mtl malzeme dosyaları ve dokular çözülür.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const options = new ObjLoadOptions();
options.enableMaterials = true; // parse .mtl file if present
const scene = new Scene();
scene.open('model.obj', options);
// Inspect materials attached to nodes
for (const node of scene.rootNode.childNodes) {
if (node.entity && node.entity.material) {
console.log(`Material on "${node.name}": ${node.entity.material.constructor.name}`);
}
}Yaygın Sorunlar ve Çözümler
Hata: ‘@aspose/3d/formats/obj’ modülü bulunamıyor Biçim alt yolları Node.js 12.7+ paket ihracatlarını gerektirir. Node.js 18 veya daha yeni bir sürümde olduğunuzdan emin olun. TypeScript kullanıyorsanız, ayarlayın "moduleResolution": "node16" veya "bundler" içinde tsconfig.json.
scene.rootNode.childNodes, open() sonrası boştur Bazı OBJ dosyaları standart dışı satır sonları kullanır veya son satırda yeni satır bulunmaz. Dosyanın geçerli bir OBJ olduğunu bir metin düzenleyicide açarak doğrulayın. Ayrıca gönderdiğinizin ObjLoadOptions ve genel bir LoadOptions: biçim‑özel seçeneklerin doğru yönlendirme için gerekli olduğunu unutmayın.
controlPoints dizisinin uzunluğu sıfır Mesh yüklenmiş olabilir ancak geometri içermiyor (ör. OBJ içinde boş bir grup). Kullan mesh.polygonCount köşe döngüsüne girmeden önce kontrol etmek için.
Büyük dosyalar için bellek kullanımı yüksek Tampondan yükleme ile scene.openFromBuffer() tepe bellek kullanımını azaltmaz: tüm dosyanın ayrıştırılması gerekir. Büyük dosyalar (> 100 MB) için Node.js sürecinizin yeterli yığına (heap) sahip olduğundan emin olun: node --max-old-space-size=4096 yourScript.js.
Tip hataları: ’entity’ ‘unknown’ tipindedir Bu entity özellik geniş bir tipte tanımlanmış. Şuna dönüştür any veya belirli bir sınıfa (Mesh, Camera, vb.) sahnenizde ne beklediğinize bağlı olarak.
Sıkça Sorulan Sorular (SSS)
scene.open() ile hangi formatlar yüklenebilir? OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX ve COLLADA (.dae) içe aktarma için desteklenir. İlgili *LoadOptions sınıfı her format için geçirin.
Seçenekleri belirtmeden bir dosya yükleyebilir miyim? Evet. scene.open('model.glb') Özel yapılandırma gerektirmeyen formatlar için seçenek olmadan çalışır. OBJ için seçenek geçmek önerilir çünkü malzeme çözünürlüğü şunlara bağlıdır enableMaterials.
Yükleme asenkron olarak çalışıyor mu? Hayır. scene.open() ve scene.openFromBuffer() senkroniktir. Bunları bir işçi iş parçacığına ya da setImmediate bir olay döngüsünü yanıt verebilir tutmanız gerekiyorsa.
OBJ dışa aktarımı destekleniyor mu? Evet. OBJ dışa aktarımı şu aracılığıyla desteklenir scene.save('output.obj'). Bu .mtl malzeme dosyası otomatik olarak yanına yazılır. .obj dosya.
OBJ yüklenirken .mtl dosyası nerede beklenir? Varsayılan olarak, ayrıştırıcı şunu arar .mtl OBJ içinde referans verilen dosya (mtllib directive) OBJ dosyasının dizinine göreceli. Her iki dosyanın da aynı klasörde olduğundan emin olun.