holodepth

Three.js · Etkileşim · Raycaster

Bounding Volume: karmaşıklığı basitliğe indirgemek

Bounding volume, karmaşık bir 3B modelin etrafını saran en basit geometrik “kafes”tir. Işın (ray) önce bu kafesle test edilir; eğer hacmi bile ıskalıyorsa içerideki binlerce poligonu hesaplamaya gerek kalmaz. Bu yaklaşımın adı early culling (erken eleme)dir.

Bu sayfa, raycaster hattında broad-phase (hızlı eleme) ile narrow-phase (mesh/üçgen testi) ayrımını pratik bir sözleşmeye bağlar: önce küre/kutu ile adayları azalt, sonra yalnız şüphelileri gerçek geometri ile doğrula.

Kesişim testinin “hit record” sözleşmesini ve closest hit kuralını hatırlamak istersen: Intersection test.

Bounding volume nedir?

Bir modelin gerçek yüzeyi (mesh), çoğunlukla çok sayıda üçgenden oluşur. Işını bu üçgenlerin tamamıyla test etmek, çoğu senaryoda gereksiz pahalıdır. Bu yüzden motorlar, objeyi önce daha basit bir “dış kabuk” ile temsil eder: kesişim yoksa aday anında düşer; kesişim varsa “şüpheli” kabul edilip bir sonraki aşamaya geçer.

Buradaki kritik kelime konservatif olmaktır: dış kabuk, objeyi gerçekten saracak şekilde seçilir (hacim, objeyi dışarıdan kapsar). Böylece “hacime çarpmadıysa kesin elenir” cümlesi güvenli hâle gelir. Tersi güvenli değildir: hacime çarpmak, her zaman geometriye temas ettiğin anlamına gelmez; sadece “kontrol etmeye değer” bir aday üretir.

Bu yüzden bounding volume, performans ile doğruluğun arasındaki anlaşmadır: broad-phase tarafı az maliyetle çok eleme yapar; narrow-phase tarafı ise az sayıda aday için pahalı ama kesin cevap üretir. Büyük sahnelerde akıcılık, bu hattı iyi kurmana bağlıdır.

Bu fikir, broad-phase/narrow-phase ayrımının sahne ölçeğindeki en net uygulamasıdır: broad-phase, hız için konservatif davranır; narrow-phase, doğruluk için gerçek yüzeye iner.

A) Bounding Sphere (çevreleyici küre)

Objeyi tamamen içine alan en küçük küreyi düşün. Matematiksel olarak yalnızca bir merkez (center) ve bir yarıçap (radius) yeterlidir.

Işın–küre testinin özeti şudur: ışın doğrusu üzerindeki en yakın nokta ile küre merkezinin uzaklığı yarıçaptan küçük/eşitse, “kesişim ihtimali var” dersin. Bu test genellikle karekök kullanmadan, distance^2 ile radius^2 karşılaştırması yaparak daha da hızlandırılır. Bu yüzden küre, broad-phase için çok popülerdir.

  • Hız: En hızlısı. Birkaç çarpma/toplama ile karar verilir.
  • Hassasiyet: Düşüktür. Uzun/ince objelerde (kılıç gibi) “boş alan” nedeniyle yalancı pozitif üretebilir.
  • Dönme tepkisi: Harika. Obje dönse bile küre değişmez (tek yarıçap).

Sezgi: ışın–küre testi çoğu zaman “bu aday kesin elensin mi?” sorusunu çok hızlı cevaplar.

Pratik ipucu: Yalancı pozitif üretmesi aslında “hata” değildir; broad-phase’in görevi kesin doğruyu bulmak değil, pahalı aşamaya gidecek aday kümesini küçültmektir. Yani küre, “çok hızlı bir ilk kapı”dır; ikinci kapı (AABB veya mesh) doğruluğu geri getirir.

B) Bounding Box (AABB — eksene paralel kutu)

AABB (Axis Aligned Bounding Box), objeyi içine alan eksene paralel kutudur. Minimum (x_min,y_min,z_min) ve maksimum (x_max,y_max,z_max) köşe koordinatlarıyla tanımlanır.

AABB’nin “sıkı” olmasının nedeni, küre gibi her yönde aynı yarıçapı taşımamasıdır: X/Y/Z eksenlerinde ayrı aralıklar tutar. Bu yüzden uzun ve ince modellerde, “boş alan” problemi küreye göre ciddi biçimde azalır.

  • Hassasiyet: Küreye göre daha “sıkı” oturur; yalancı pozitif azalır.
  • Hesaplama: Işının kutunun X/Y/Z aralıklarıyla kesişimi kontrol edilir. Küreye göre daha karmaşık ama üçgen testine göre hâlâ çok hızlıdır.
  • Dönme tepkisi: Kötü. Obje döndükçe AABB yeniden hesaplanmalıdır (ya da OBB gibi başka primitif gerekir).

“Kesişimi kontrol et” pratikte çoğu zaman slab yöntemiyle yapılır: ışının her eksende hangi t aralığında kutunun içine düştüğü bulunur; bu üç aralığın kesişimi boş değilse kutu “vurulmuş” kabul edilir. Bu, üçgen testine kıyasla hâlâ çok ucuzdur.

Strateji: hiyerarşik kontrol mekanizması

Gerçek zamanlı bir raycaster sisteminde amaç, en pahalı işlemi (üçgen testi) en sona saklamaktır. Süreç bir filtreleme hattı gibi çalışır:

Bu hattın psikolojisi önemlidir: broad-phase, “yanlışlıkla bazı adayları içeri alabilir” ama “doğru adayı asla dışarı atmaz” prensibiyle çalışır. Bu yüzden konservatif hacimler tercih edilir. Narrow-phase ise “gerçek cevabı” üretir; yanlış pozitifleri temizler.

  1. Hızlı eleme (broad-phase): Işın fırlatılır; her objenin bounding sphere/AABB hacmi test edilir. Hacme çarpmadıysa obje anında reddedilir.
  2. Dar alan analizi (narrow-phase): Hacme çarptıysa artık gerçek geometriyle yüzleşme zamanıdır: mesh içindeki üçgenlerle kesişim testi yapılıp “gerçek temas” milimetrik olarak belirlenir.

Bu iki aşama, sahnede binlerce obje varken bile akıcılığı korumaya yardım eder: genişten dara doğru ilerlerken aday sayısı dramatik biçimde düşer.

Büyük mesh’lerde bu fikir bir kez daha “mesh içinde” tekrarlanır: broad-phase aday olan bir modelin içinde bile, üçgenleri tek tek gezmek yerine bir BVH (bounding volume hierarchy) ile üçgen alt-ağaçlarına hızla indirgenir. Yani broad/narrow ayrımı sahnede başlar, gerektiğinde modelin içinde de devam eder.

Demo: “Two Gates System” — ışın önce sphere (broad), sonra AABB (daha sıkı filtre), en son mesh (narrow) ile test edilir. Yanlış pozitif durumunu özellikle izle.

Kapılar

Senaryo

İpucu: Sphere açıkken “hit” görüp mesh’te “miss” yaşarsan, broad-phase’in konservatif olduğunu hatırla.

Neden ikisini de kullanırız?

Küre ve AABB aynı işi yapar (hızlı eleme) ama farklı trade-off’ları vardır. Aşağıdaki tablo, seçimi sezgisel hâle getirir.

Pratikte tek bir “doğru” yoktur: sahnede çok fazla obje varsa küre ile ilk eleme daha iyi olabilir; hedef objeler uzun/ince ise AABB ikinci kapı olarak daha iyi sonuç verir. Birçok motorda bu yüzden her ikisi de bulunur ve sırayla kullanılır.

Özellik Bounding Sphere Bounding Box (AABB)
Matematiksel karmaşıklık Çok düşük (merkez + yarıçap) Orta (aralık kontrolü)
Dönme (rotation) tepkisi Harika (hacim değişmez) Kötü (yeniden hesaplanmalı)
Sıkılık (tightness) Gevşek (boş alan fazla) Sıkı (objeye daha yakın)
Kullanım yeri Çok hızlı arka plan elemeleri Mesh picking ve daha hassas çarpışmalar

HoloDepth örneği: orman sahnesi

10.000 ağaçlık bir sahne düşün. Kamera ışını fırlatıldığında:

  • Önce 10.000 ağacın küreleri kontrol edilir — saniyenin çok küçük bir kısmında büyük çoğunluk elenir.
  • Kalan birkaç adayın AABB’leri kontrol edilir — daha sıkı bir filtre devreye girer.
  • Son kalan 1–2 aday için yaprak/mesh poligonlarıyla gerçek kesişim hesaplanır.

Bu yöntemle “imkânsız” görünen hesaplar, web tarayıcılarında bile akıcı (60 FPS) bir akışa yaklaşır. Ana fikir basittir: pahalıyı geç yaptır.

Bu yaklaşım, sadece hız değil tutarlılık da sağlar: aynı tıklama/hover akışında, önce sahne ölçeğinde adaylar süzülür; sonra seçimin “gerçek” olup olmadığı netleşir. Kullanıcı tarafında bu, daha az “boşluğa tıkladım ama seçti” hissi demektir.