holodepth

Three.js · Sahne & geometri

Geometrinin anatomisi ve veri yönetimi

3D web geliştirmede geometri, bir nesnenin uzaydaki fiziksel varlığını tanımlayan saf matematiksel veridir. Three.js'te bir objeyi "görmek", aslında GPU'ya binlerce noktanın koordinatlarını ve bu noktaların nasıl birleşeceğini söylemektir. Modern bir projede asıl iş, bu veriyi doğru yapılandırmak ve verimli taşımaktır.

Pratikte ekranda gördüğünüz cisim bir Mesh'tir: geometri (shape — şekil) ile materyal (appearance — görünüş) bir araya gelir; şekil verisi tek başına renk, parlaklık veya doku üretmez. Materyal Giriş sayfası bu ikinci yarıyı tamamlar.

3D veri katmanları: vertex'ten yüzeye

Dijital bir objenin iskeleti üç temel hiyerarşiden oluşur:

  • Vertices (noktalar): Uzaydaki (x, y, z) koordinatları. Her şeyin başladığı atomik birimdir.
  • Edges (kenarlar): İki noktayı birleştiren çizgiler. Genellikle tel kafes (wireframe) görünümlerde belirginleşirler.
  • Faces (yüzeyler): Üç noktanın birleşmesiyle oluşan üçgenler. GPU'lar yalnızca üçgenleri rasterize edebilir (ekrana çizebilir); bu yüzden karmaşık tüm modeller aslında devasa bir "üçgen çorbası"dır.

Tüm modern GPU'lar, nihai olarak her yüzeyi üçgenlere indirger (triangulation) — dörtgen veya daha karmaşık çokgenler bile rasterization aşamasında bu atomik üçgenlere ayrılır.

Winding order (vertex sırası): Bir üçgenin köşelerinin bağlanma yönü, yüzeyin "ön" mü yoksa "arka" mı olduğunu belirler. Ters bir sıralama, yüzeyin kameraya arkasını dönmesine ve materyal ayarlarınıza bağlı olarak görünmez olmasına (back-face culling) yol açar.

Hazır geometriler ve parametrik yaklaşım

Three.js, matematiksel formüllerle anında üretilebilen primitive (ilkel) geometriler sunar. Bu yapılar öğrenme aşamasında hız kazandırsa da, üretim aşamasında segment yönetimi hayati önem taşır:

  • Segment sayısı: Bir küreyi veya kutuyu kaç küçük parçaya böldüğünüzdür.
  • Performans bütçesi: Gereksiz yüksek segment değerleri, GPU belleğini şişirir. Düşük poligonlu (low-poly) bir modelle yüksek kaliteli bir materyal birleştiğinde, yüksek poligonlu bir modelden daha verimli sonuçlar alınabilir.

BufferGeometry: GPU ile doğrudan iletişim

Three.js'in performans kalbi BufferGeometry yapısında atar. Bu yapı, veriyi JavaScript'in hantal nesne yapısından çıkarıp, GPU'nun anadilinde (typed array'ler) saklar.

  • Hız: RAM ile GPU arasındaki veri transferi minimize edilir.
  • Öznitelikler (attributes): Geometrinin sadece konumunu (position) değil, ışıkla etkileşimini (normal) ve dokuların nasıl sarılacağını (uv) bu tampon belleklerde saklarız.

Bu veriler, renderer tarafından işlenerek nihai olarak piksellere dönüştürülür; pipeline'ın bu uç kısmı için Renderer sayfasına bakabilirsiniz.

Teknik tablo: veri türleri ve fonksiyonları

Özellik Teknik karşılık Neden önemli?
Position Float32Array Nesnenin asıl fiziksel şeklini ve hacmini belirler.
Normal Vector3 (attribute olarak paketlenir) Yüzeyin baktığı yönü belirleyerek gölge ve ışık hesaplarını mümkün kılar.
UV mapping Vector2 (attribute olarak paketlenir) 2D bir resmin (doku), 3D yüzeye hatasız giydirilmesini sağlar.
Index Uint16Array / Uint32Array Aynı noktayı kullanan üçgenlerde veriyi tekrar yazmaz; bellek tasarrufu sağlar.

Uygulama: manuel veri yönetimi

Bir BufferGeometry oluştururken sadece noktaları girmek yetmez; sistemi tam verimle çalıştırmak için sınırlayıcı hacimleri (bounding volumes) hesaplamalı ve ışık için gerekliyse normalleri üretmelisiniz:

// 1. Veri hazırlığı
const geometry = new THREE.BufferGeometry();
const vertices = new Float32Array([-1, -1, 1, 1, -1, 1, 1, 1, 1]);

// 2. Veriyi GPU'ya bağlama
geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));

// 3. Otomatik hesaplamalar (hayati adımlar)
geometry.computeVertexNormals(); // Işık hesapları için gerekli
geometry.computeBoundingBox(); // Görünürlük (culling) testleri için gerekli
geometry.computeBoundingSphere(); // Mesafe bazlı optimizasyonlar için gerekli

Holodepth notu: Bellek temizliği (dispose)

Yazılım dünyasında çöp toplayıcılar (garbage collector) JavaScript nesnelerini temizler, ancak GPU belleği için bu geçerli değildir. Sahneden sildiğiniz bir nesne GPU belleğinde yaşamaya devam edebilir. Uzun süreli oturumlarda projenizin çökmemesi için, artık kullanılmayan geometrileri mutlaka geometry.dispose() komutuyla bellekten tamamen atmalısınız.

Görselleştirme ve diyagramlar hakkında

Mete, bu bölümde geometrileri görsel olarak şu şekilde destekleyeceğiz:

  • Vertex & face diyagramı: Bir küpün köşelerini, kenarlarını ve üçgen yüzeylerini şeffaf bir hiyerarşiyle gösteren görsel.
  • UV mapping illüstrasyonu: Bir kağıdı (doku) bir kutunun (geometri) etrafına sarma mantığını gösteren diyagram.
  • Bounding box görseli: Bir nesnenin etrafındaki hayali sınır kutusunun, kamera görünürlük testlerinde (frustum culling) nasıl kullanıldığını anlatan grafik.