Sahne Grafiği ile Çalışma
Tüm 3B içerik Aspose.3D FOSS for TypeScript içinde bir Scene ağaç şeklinde düzenlenmiş bir nesne Node nesneler. Bu hiyerarşiyi anlamak, herhangi bir 3B dosyasını oluşturmanın, yüklemenin ve işlemenin temelidir.
Kurulum
Bu kılavuzdaki kodları çalıştırmadan önce paketi npm üzerinden kurun:
npm install @aspose/3dKendi tsconfig.json içerir "module": "commonjs" ve "moduleResolution": "node" doğru alt yol içe aktarma çözümlemesi için.
Sahne Grafiği Kavramları
Sahne grafiğinin üç katmanı vardır:
| Seviye | Sınıf | Rol |
|---|---|---|
| Sahne | Scene | Üst düzey kapsayıcı. Tutar rootNode, animationClips, ve assetInfo. |
| Düğüm | Node | Adlandırılmış ağaç düğümü. Çocuk düğümler, bir varlık, bir dönüşüm ve materyaller içerebilir. |
| Varlık | Mesh, Camera, Light, … | Bir düğüme eklenmiş içerik. Bir düğüm en fazla bir varlık taşır. |
Ana yapı taşları için kalıtım zinciri şudur:
A3DObject
└─ SceneObject
├─ Node (tree structure)
└─ Entity
└─ Geometry
└─ Mesh (polygon geometry)scene.rootNode otomatik olarak oluşturulur. Bunu manuel olarak oluşturmazsınız; onun altında alt düğümler oluşturursunuz.
Step 1: Create a Scene
import { Scene } from '@aspose/3d';
const scene = new Scene();
console.log(scene.rootNode.name); // '' (empty string — the root node is created with no name)
Yeni bir Scene boş bir kök düğüm ve hiçbir animasyon klibi olmadan başlar. İçeriği, alt düğümler ekleyerek oluşturursunuz.
Adım 2: Alt Düğümler Ekle
Kullan createChildNode() ağacı büyütmek için. Metot yeni Node, böylece herhangi bir seviyeden daha fazla çağrıyı zincirleyebilirsiniz:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const parent = scene.rootNode.createChildNode('parent');
const child = parent.createChildNode('child');
console.log(scene.rootNode.childNodes.length); // 1 (parent)
console.log(parent.childNodes.length); // 1 (child)
Düğüm adları keyfi dizgelerdir. Adların benzersiz olması gerekmez, ancak anlamlı adlar kullanmak dolaşım kodunun hata ayıklamasını kolaylaştırır.
Adım 3: Bir Mesh Oluştur ve Vertex’leri Ayarla
Mesh birincil geometri sınıfıdır. Vertex konumlarını iterek ekleyin Vector4 değerleri içine mesh.controlPoints, ardından çağırın createPolygon() vertex indeksine göre yüzeyleri tanımlamak için:
import { Scene } from '@aspose/3d';
import { Mesh } from '@aspose/3d/entities';
import { Vector4 } from '@aspose/3d/utilities';
const scene = new Scene();
const child = scene.rootNode.createChildNode('parent').createChildNode('child');
const mesh = new Mesh('cube');
mesh.controlPoints.push(new Vector4(0, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 1, 0, 1));
mesh.controlPoints.push(new Vector4(0, 1, 0, 1));
mesh.createPolygon(0, 1, 2, 3); // quad face using all four vertices
child.entity = mesh;
console.log(mesh.controlPoints.length); // 4
console.log(mesh.polygonCount); // 1
Vector4 homojen koordinatları kullanır: w bileşen 1 konumlar için ve 0 yön vektörleri için.
Step 4: Set Node Transforms
Her düğüm bir transform özelliğe sahiptir translation, rotation, ve scaling. Ayarlayın translation düğümü ebeveynine göre hareket ettirmek için:
import { Scene } from '@aspose/3d';
import { Mesh } from '@aspose/3d/entities';
import { Vector4, Vector3 } from '@aspose/3d/utilities';
const scene = new Scene();
const parent = scene.rootNode.createChildNode('parent');
const child = parent.createChildNode('child');
const mesh = new Mesh('cube');
mesh.controlPoints.push(new Vector4(0, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 1, 0, 1));
mesh.controlPoints.push(new Vector4(0, 1, 0, 1));
mesh.createPolygon(0, 1, 2, 3);
child.entity = mesh;
child.transform.translation = new Vector3(2.0, 0.0, 0.0);globalTransform tüm ata dönüşümlerini birleştirerek hesaplanan (salt okunur) dünya-uzayı dönüşüm matrisini sağlar.
Adım 5: Ağacı Gezin
Her düğümü ziyaret etmek için bir özyinelemeli fonksiyon yazın. Kontrol edin node.entity ve node.childNodes her seviyede:
function traverse(node: any, depth = 0): void {
const indent = ' '.repeat(depth);
const entityType = node.entity ? node.entity.constructor.name : 'none';
console.log(`${indent}${node.name} [${entityType}]`);
for (const child of node.childNodes) {
traverse(child, depth + 1);
}
}
traverse(scene.rootNode);Yukarıda oluşturulan hiyerarşi için çıktı şu şekilde olacaktır:
[none]
parent [none]
child [Mesh]Kök düğüm adı boş bir dizedir çünkü Scene ad argümanı olmadan oluşturur.
Bir varlığa (entity) erişmeden önce her zaman null kontrolü yaparak koruyun ve ardından belirli bir tipe dönüştürün. Her düğüm bir varlık taşımaz.
Adım 6: glTF veya GLB olarak kaydet
Kullan GltfSaveOptions çıktı biçimini kontrol etmek için. Ayarla binaryMode = true tek bir bütünleşik üretmek için .glb dosya; bırak false JSON için .gltf + .bin yan taşıma çifti:
import { Scene } from '@aspose/3d';
import { Mesh } from '@aspose/3d/entities';
import { Vector4, Vector3 } from '@aspose/3d/utilities';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
const parent = scene.rootNode.createChildNode('parent');
const child = parent.createChildNode('child');
const mesh = new Mesh('cube');
mesh.controlPoints.push(new Vector4(0, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 1, 0, 1));
mesh.controlPoints.push(new Vector4(0, 1, 0, 1));
mesh.createPolygon(0, 1, 2, 3);
child.entity = mesh;
child.transform.translation = new Vector3(2.0, 0.0, 0.0);
const saveOpts = new GltfSaveOptions();
saveOpts.binaryMode = true; // write a single .glb file
scene.save('scene.glb', GltfFormat.getInstance(), saveOpts);
console.log('Scene saved to scene.glb');Geçir GltfFormat.getInstance() biçim argümanı olarak, böylece kütüphane dosya uzantısına bakılmaksızın doğru kodlayıcıyı kullanır.
İpuçları ve En İyi Uygulamalar
- Kullan
createChildNode()oluşturmak yerineNodedoğrudan:createChildNode()ebeveyn-çocuk ilişkisini otomatik olarak bağlar ve düğümü ağaçta kaydeder. - Kontrol et
node.entityvarlık özelliklerine erişmeden önce: çok sayıda düğüm (grup düğümleri, kemikler, konumlayıcılar) bir varlık taşımaz. Her zaman bir null kontrolüyle koruyun veyainstanceoftest. - Ayarla
translationçocuk düğümlerinde, mesh vertices üzerinde değil:değiştirmetransform.translationyıkıcı değildir ve üst dönüşümlerle birleştirilebilir. - Tercih edin
binaryMode = trueGLB için: tek.glbdosya, bölünmüş olanına göre dağıtması, tarayıcılarda yüklemesi ve oyun motorlarına aktarması daha kolaydır.gltf+.binformat. - Şu aracılığıyla geç
for...ofüzerindechildNodes: sayısal indekslemeyi önleyin; ileri uyumluluk için yinelemeyi doğrudan kullanın.
Yaygın Sorunlar
| Semptom | Muhtemel Neden | Düzeltme |
|---|---|---|
child.entity = mesh dışa aktarmayı etkilemez | Varlık yanlış düğüm seviyesine atandı | Ata entity yaprak düğümüne, grup düğümüne değil |
node.entity her zaman null | Sadece kontrol rootNode kendisi | İçine yinele node.childNodes; rootNode genellikle varlık içermez |
| Transform GLB görüntüleyicide yansıtılmadı | globalTransform güncellenmedi | globalTransform kaydetme sırasında hesaplanır; ayarla transform.translation çağırmadan önce scene.save() |
GLB ayrı bir .bin sidecar | binaryMode varsayılan olarak false | Ayarla saveOpts.binaryMode = true |
Ayrıca Bakınız
- Özellikler ve İşlevsellikler: tüm özellik alanları için tam API referansı.
- Format Desteği: desteklenen 3D formatlar, okuma/yazma yeteneği ve format seçenekleri.
- 3D Mesh’i Programlı Olarak Nasıl Oluşturulur