holodepth

Three.js · Etkileşim · Raycaster

Layer filtreleme: seçici görüşün gücü

Layer filtering, bir Raycaster ışınının dünyadaki her şeyi “görmesi” yerine, sadece belirli kategorideki nesneleri dikkate almasını sağlayan bir maskeleme sistemidir. Işın fırlatılmadan önce ona bir “anahtar” verilir; anahtarın uymadığı kapılar (objeler) ışın tarafından tamamen yok sayılır.

Bu sayfa, katmanlamayı üç seviyede kurar: sahnede mantıksal katmanlar (UI / oyun dünyası / görünmez mantık), bunun teknik karşılığı olan bitmask ve bu yaklaşımın getirdiği performans + tutarlılık avantajı.

Broad-phase mantığını tazelemek istersen: Bounding volume.

Layer filtreleme nedir?

Aynı ray, farklı amaçlarla kullanılabilir: bir menü butonunu seçmek, bir düşmanı vurmak, bir engeli görmek, bir tetikleyiciyi yakalamak… Eğer ışın her şeyi görürse, hem gereksiz hesaplamaya girer hem de seçim davranışı “rastgele” hissedebilir (partiküller, sis, cam yüzeyler seçim önüne geçebilir).

Katman filtresi, ışının “neyi görmezden geleceğini” öğretir. Bu, hem maliyeti düşürür hem de kullanıcı deneyimini (UX) daha öngörülebilir yapar.

Bu problem yalnızca “hız” değildir; aynı zamanda seçim sözleşmesidir. Kullanıcı bir butona tıklıyorsa, ray’in önceliği butondur; arka plandaki dekorun “kazanması” kullanıcı zihninde bir hata gibi algılanır. Katman filtresi, bu sözleşmeyi sistem seviyesinde netleştirir: hangi ray hangi dünyayı görür?

Katmanlama, Raycaster akışında en erken kapıdır: bounding volume gibi broad-phase elemelere girmeden bile, aday kümesini anında küçültür. Bu yüzden özellikle hover (sürekli çalışan seçim) senaryolarında maliyeti doğrudan düşürür.

A) Mantıksal katman yapısı

Bir 3B sahnede objeler farklı görevlere hizmet eder. Katmanlama, bu görevleri birbirinden izole ederek “seçim” ve “algı” akışını daha temiz kurar.

  • UI Layer (arayüz): Butonlar, paneller, 3B dünyada asılı menüler.
  • Game Object Layer (oyun dünyası): Karakterler, ağaçlar, binalar.
  • Invisible Logic Layer (görünmez mantık): Tetikleyiciler, görünmeyen çarpışma bariyerleri, sadece mantık için var olan bölgeler.

Bu ayrım, “aynı sahne ama farklı gözler” fikrini mümkün kılar: kullanıcı ray’i yalnızca tıklanabilirleri görürken, AI ray’i engelleri görür.

Pratikte bu, “görünürlük” ile “etkileşim”i ayırmak demektir: bir obje ekranda görünse bile etkileşime kapalı olabilir (dekor), ya da görünmez olup sadece mantık için var olabilir (trigger). Katmanlar, bu iki kavramı birbirine karıştırmadan yönetmeni sağlar.

Bitmasking ve maskeleme mekanizması

Layer filtreleme, düşük seviyede bitmask mantığıyla çalışır. Her nesnenin bir katman değeri vardır; ray fırlatılırken bir maske tanımlanır. Kontrol, çok hızlı bir “mantıksal VE” (AND) işlemine indirgenir:

object.layer & ray.mask

Sonuç sıfır değilse obje “görünür” kabul edilir; sıfırsa ray onu tamamen yok sayar. Bu, performans açısından çok ucuzdur ve broad-phase öncesi bile aday kümesini küçültür.

Bitmask yaklaşımının gücü şudur: tek bir integer ile “birden çok katmanı” aynı anda seçebilirsin. Örneğin UI + Interactable katmanlarını aynı maske içinde birleştirip tek ray ile tarayabilirsin. Bu, yüksek seviyede “kategori seçimi” gibi görünür; düşük seviyede ise birkaç CPU talimatıdır.

Tasarım ipucu: Maske kurallarını mümkün olduğunca merkezi tut. Böylece “hangi ray neyi görür?” sorusu, projede dağılmış if/else’ler yerine tek bir sözleşmeye bağlanır.

Demo: “Multi Vision System” — aynı sahne, aynı ekran içi ışın; yalnızca ray mask değişince hangi nesnelerin test edildiği ve ilk temasın ne olduğu değişir. Önde bir UI paneli, ortada torus knot, görünmez bir mantık hacmi ve arka planda dekor bulunur.

Ray Mask

Objects Tested

Hit

Dekor

Layer demo İmleci sahne üzerinde gezdir; maskeli aday sayısı canlı güncellenir.

Ray Mode

Ray sadece UI katmanını görüyor. Dünya tamamen yok sayılıyor.

Wow: Işın geometrisi değişmez; sadece hangi katmanların test edildiği değişir — ilk temas buna göre kayar.

Layer filtrelemenin kritik avantajları

1) Gereksiz hesaplamaların azalması

Sadece menü butonuna tıklanıp tıklanmadığını kontrol ediyorsan, arkadaki devasa şehri ve milyonlarca poligonu test etmek kaynak israfıdır. Ray’i sadece “UI” katmanına kilitlemek, CPU yükünü dramatik biçimde azaltabilir.

Bu optimizasyon, “tek tıklama”dan daha önemlisi olan sürekli akışlarda ortaya çıkar: hover highlight, drag/select, gizmo manipülasyonu gibi durumlarda ray her kare çalışır. Katman filtresi bu akışlarda gereksiz adayları baştan elediği için stabil FPS’e doğrudan katkı sağlar.

2) Tutarlı seçim / kontrol kolaylığı

Şeffaf sis, partiküller veya dekoratif yüzeyler seçimi engellememelidir. “Effects” katmanını ray’den gizlersen, kullanıcı her zaman arkasındaki asıl hedefe (kapıya) tıklayabilir.

Buradaki kazanç, “kullanıcı hata yapmasın” değil; kullanıcı ne yaparsa aynı sonucu alsın duygusudur. Seçim mekanizmasının tutarlı olması, etkileşim tasarımının premium görünmesini sağlar.

3) Çoklu raycaster kullanımı

Aynı sahnede farklı amaçlarla çalışan birden fazla “göz” olabilir:

  • AI gözü: Sadece duvarları/engelleri görür.
  • Mouse picker: Sadece tıklanabilir eşyaları görür.
  • Işık ray’i: Sadece ışık geçirmeyen katı objeleri görür (gölge sezgisi).

Bu yapı sayesinde aynı sahnede “farklı gerçeklikler” yaşatabilirsin: kullanıcı UI’ı seçerken, AI başka bir katmanda yol bulur; fizik başka bir katmanda çarpışma çözer. Hepsi aynı geometriyi paylaşsa bile, “hangi ray neyi görür?” sözleşmesi nettir.

Pratik kullanım senaryoları

Katman filtresi, seçim ve algı problemlerini “tek hamlede” çözen bir araçtır. Aşağıdaki tablo, gerçek dünya senaryolarında nasıl kullanıldığını özetler.

Ortak desen şu: ışına görev ver. “Her şeyi gör” yerine, “şu kategoriyi gör / şu kategoriyi asla görme” şeklinde net kurallar koyduğunda hem performans hem de kullanıcı hissi düzelir.

Senaryo Filtreleme stratejisi Sonuç
FPS oyunu Işın, “kendi karakteri” katmanını görmez. Kendi içinden ateş etme / kendini seçme problemleri azalır.
Mimari görselleştirme Işın sadece “mobilya” katmanını görür. Duvar içindeki görünmez detaylara yanlışlıkla tıklanmaz.
Strateji oyunu Işın “arazi” ve “birim” katmanlarını ayrı tarar. Birime tıklayınca seçim, araziye tıklayınca hareket emri.

Holodepth teknik özet

Layer filtreleme, bir Raycaster’a “neye bakması gerektiğini” değil, “neyi görmezden gelmesi gerektiğini” öğretir. Karmaşık sahnelerde performansı stabil tutmanın ve seçim UX’ini pürüzsüzleştirmenin en kısa yollarından biridir.

Holodepth tarafında bunu bir refleks hâline getirmek istiyoruz: önce katman maskesi ile adayları daralt, sonra bounding volume ve mesh testine in. Bu sıra, hem “hız” hem de “tutarlılık” üretir.