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/3d

Kendi 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:

SeviyeSınıfRol
SahneSceneÜst düzey kapsayıcı. Tutar rootNode, animationClips, ve assetInfo.
DüğümNodeAdlandırılmış ağaç düğümü. Çocuk düğümler, bir varlık, bir dönüşüm ve materyaller içerebilir.
VarlıkMesh, 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 yerine Node doğrudan: createChildNode() ebeveyn-çocuk ilişkisini otomatik olarak bağlar ve düğümü ağaçta kaydeder.
  • Kontrol et node.entity varlı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 veya instanceof test.
  • Ayarla translation çocuk düğümlerinde, mesh vertices üzerinde değil:değiştirme transform.translation yıkıcı değildir ve üst dönüşümlerle birleştirilebilir.
  • Tercih edin binaryMode = true GLB için: tek .glb dosya, bölünmüş olanına göre dağıtması, tarayıcılarda yüklemesi ve oyun motorlarına aktarması daha kolaydır .gltf + .bin format.
  • Şu aracılığıyla geç for...of üzerinde childNodes: sayısal indekslemeyi önleyin; ileri uyumluluk için yinelemeyi doğrudan kullanın.

Yaygın Sorunlar

SemptomMuhtemel NedenDüzeltme
child.entity = mesh dışa aktarmayı etkilemezVarlık yanlış düğüm seviyesine atandıAta entity yaprak düğümüne, grup düğümüne değil
node.entity her zaman nullSadece kontrol rootNode kendisiİçine yinele node.childNodes; rootNode genellikle varlık içermez
Transform GLB görüntüleyicide yansıtılmadıglobalTransform güncellenmediglobalTransform kaydetme sırasında hesaplanır; ayarla transform.translation çağırmadan önce scene.save()
GLB ayrı bir .bin sidecarbinaryMode varsayılan olarak falseAyarla saveOpts.binaryMode = true

Ayrıca Bakınız

 Türkçe