holodepth

Three.js · Etkileşim · Raycaster

Intersection test: dijital temasın matematiği

Intersection test, fırlatılan bir ışının (ray) sahnedeki geometrik yapılarla (object) uzayda aynı noktayı paylaşıp paylaşmadığını bulma sürecidir. Sonuç çoğu zaman yalnızca «evet/hayır» değildir; motorun diğer parçalarının tükettiği bir hit record (çarpışma verisi) paketi üretir.

Bu sayfa, kesişim testini hiyerarşi (broad-phase / narrow-phase), kimlik & filtreleme (katmanlar ve etiketler), closest hit seçimi (smallest positive t) ve erken çıkış optimizasyonları üzerinden bir mühendislik sözleşmesi olarak anlatır.

Işının temel formülü ve t parametresinin yaşam çizgisi yorumu için önce Işın temeli · t’nin anlamı sayfasını referans alabilirsiniz; burada tekrar etmek yerine kesişim testinin «işletim sistemini» kuruyoruz.

Kesişim testi nedir?

Tabanda her şey aynı soyutlukla başlar: bir ray — köken ve yön — uzayda yönlü bir sorgu çizgisidir. Kesişim testi ise bu çizgiyi, sahne geometrisiyle aynı noktada buluşturan bir cevap üreticisi gibi düşünülebilir: sadece «evet/hayır» değil, çoğu zaman nerede ve neye değiyor bilgisidir. Bu, render’dan fiziğe kadar tüm hattı besleyen ortak sorgu dilidir.

Matematiksel cümle gibi söylersek: ışın üzerindeki noktalar, bilinen formülle (bkz. Işın ve t parametresi) yürütülür; kesişim sorusu da «bu noktaların, verilen yüzey/üçgen/hacim ile ortak çözümü var mı?» aramasına indirgenir. Çözümler tipik olarak t skalerleri (veya eşdeğer parametreler) olarak döner; picking tarafı bunu ekran–dünya dönüşümüne bağlarken, fizik tarafı aynı veriyi hız/impuls için tüketir.

Pratik sözleşme şöyle kurulur: aynı geometri, farklı modlarda aynı testi farklı sıkıklıkla ister. Örneğin sadece «ilk temas noktası mı?», yoksa cisim içinden de geçen tüm vuruşlar mı? Bu yüzden motorlar yalnızca tek cevabı üretmekle kalmayabilir; kesişim listesi toplar, sonra siz uygulama kuralıyla sınırlarsınız: «en küçük pozitif t yeterli mi?», «şeffaflar sayılsın mı?», «katman dışı aday elensin mi?» — yani seçim, saf geometrinin dışındadır (kimlik, katman ve t siyaseti için 3 ve 4).

Sonuç: kesişim testi, «doğruluk» tek başına değil; aynı zamanda hangi aşamada ne kadar pahalıya tahammül var? sorusunun cevabıdır. Bu yüzden aşağıdaki bölümde, önce aşamaları (2) açıyor; sonra aynı hattı optimizasyona (6) veya etkileşim örneklerine taşımak mümkün olur.

Kesişim mantığının hiyerarşisi

Modern motorlarda, her ışın için tüm sahnenin tüm poligonlarını aynı anda test etmek maliyetli (ve genelde israf) olur. Bu yüzden kesişim, çoğu zaman bir elene, sonra doğrula sözleşmesine oturtulur. İş yükünü azaltmak için tipik model iki aşamalıdır — aynı fikir hem nesne ölçeğinde, hem büyük mesh’lerin içinde (üçgen ağaçları) tekrar edebilir; özü değişmez: önce ucuz, sonra pahalı.

Sezgisel eşleme: «Bu aday, ışını gerçekten kesebilir mi?» sorusu broad tarafta çok hızlı yanıtlanır; «Hangi noktada, hangi yapı, hangi normalle kesiyor?» sorusu narrow tarafta ayrıntılı cevaplanır. Bu ayrışma, ışının amacıyla da uyumludur: bazı ışınlar sadece «var/yok» (menüden önce) ister, bazıları ise tam UV/yüz indeksi ister. Bu ikinci tür, narrow aşamadan çıkmaz.

  • Broad-phase (bounding volume test): Her obje, bir taşıyıcı hacimle özetlenir: en yaygınları AABB ve küre; bazı sahnelerde hizalı kutu (OBB) veya kapsüle benzeri primitifler de tercih edilebilir. Işın bu hacimle kesişmiyorsa, aynı obje için üçgen testine girmenin anlamı yoktur — obje aday kümesinden düşer. Pratik kural: taşıyıcı hacim geometriyi dışarıdan saran (konservatif) tutulur; o zaman «hacime çarpmadıysa, gerçek yüzeyle de çarpmamıştır» güvenli bir yorumdur. Tersi her zaman geçerli değildir: hacme çarpmak, üçgenlere değmek anlamına gelmeyebilir; bu belirsizliği narrow aşama çözer.
  • Narrow-phase (triangle / yüz seviyesi): Işın aday sınırını geçtiyse, asıl pahalı bölgedesinizdir: pratikte çoğunlukla üçgen–ışın testleri, bazen yama yüzeyleri / özel primitifler. Çıktı, yalnızca «t» değil; çoğu hatırlamada barysentrik, yüz/üçgen indeksi ve doğru doku örneklemesi için UV gibi alanlara kadar büyür. Bu, bir sonraki bölümlerde bahsettiğimiz hit record ile doğrudan örtüşür; burada sadece «hangi aşamada üretildikleri»ni sabitliyoruz.

Maliyet sezgisi: broad, tipik olarak adet × ucuz sınama; narrow, genelde az sayıda aday × pahalı sınama. Sahnenin büyüklüğü, broad’u zorlar; mesh’in detayı narrow’u. Bu yüzden aynı iki aşamalı bakış, bazen tek objenin içinde de hiyerarşik hâle gelir: önce üçgenlere ait bir BVH ile geniş ağı daralt, sonra yalnız gerekli üçgeni doğrula.

Kısacası: broad-phase, aday kümesini küçültür; narrow-phase, o kümede güvenilir cevabı üretir. Filtreleme ve sözleşmeler (katman/etiket ve closest t) ise bu hattın üstünde «hangi aday anlamlı?» sorusunu çözer. Büyük sahnelerde performansın kilidi, bu ayrımı disiplinli kurmaktır — aksi halde en iyi algoritma bile her karede maliyet patlamasına döner.

Hangi obje? Kimlik, katman ve etiket

Bir ışın uzayda ilerlerken aynı yörünge üzerinde birden fazla aday üretebilir: farklı nesneler, aynı nesnenin farklı parçaları veya hiyerarşideki üst/alt düğümler. Bu yüzden «hangisine çarptım?» sorusu, yalnızca geometrik bir sıralama değil; aynı zamanda hangi referansın raporlanacağı sorusudur. Benzersiz kimlikler (UUID, Object ID, motorun tuttuğu kalıcı tutamak) bu cevabı kareler arasında taşınabilir kılar — fakat pratikte asıl güç, kimliği önce filtreleyip sonra seçmekten gelir.

Özellikle sahne grafiğinde, vuruş çoğu zaman bir Mesh yüzeyine indirgenir; fakat oyun mantığı «grubu mu, parçayı mı, özel bir yardımcı objeyi mi?» seçmek isteyebilir. Bu yüzden motorlar, hit record’a yalnızca üçgen bilgisini değil, hangi sahne düğümünün raporlandığını da yazar — ve bazen aynı geometriyi paylaşan örnekleri ayırt etmek için ek kimliklere ihtiyaç duyarsınız.

Kimlik: referans ve kararlılık

  • Çalışma zamanı referansı: Sahne içindeki nesne tutamacı, kareler arasında hızlıdır; fakat dışa aktarım/serileştirme senaryolarında UUID gibi kalıcı kimlikler daha güvenilir olabilir.
  • Çoklu vuruş: Aynı ışın birden fazla nesneyi keserse, önce filtrelenmiş adaylar kalır; ardından closest t gibi kurallarla «hangi vuruş kazanır?» seçilir. Kimlik, bu yarışın sonucunu etiketler.

Katman: hangi ışın neyi «görür»?

  • Layer maskesi: Aynı geometri, farklı ışın türleri için farklı anlamlara sahip olabilir: seçim ışını duvarı atlayabilir; fizik ışını duvara çarpar; AI algısı yalnızca düşman katmanına bakar.
  • Şeffaflık ve özel kurallar: Şeffaf yüzeyler bazen seçimde yok sayılır, bazen tam tersi — camı özellikle seçmek gerekir. Bu, geometriden önce tanımlanan bir sözleşmedir; yoksa kullanıcı «tıkladım ama bir şey olmadı» hissine düşer.
  • Performans: Katman filtreleri, broad-phase öncesinde bile aday kümesini küçültebilir; hover gibi sürekli akışlarda bu, maliyeti doğrudan düşürür (bkz. Mesh picking · etkileşim türleri). Aynı ışının birden fazla adayı ve t sırasını görmek için bölüm 4 · Playground etkileşimine bakın; katman maskesi ayrıntısı bu sayfada yukarıda.

Etiket / materyal okuma: davranışa köprü

  • Materyal sınıfı: «Ayna», «su», «zemin» gibi ayrımlar çoğu zaman materyal parametrelerinden veya motorun userData benzeri etiket alanlarından okunur; böylece aynı geometri farklı oyun kurallarına bağlanır.
  • UI vs fizik: Etiket, etkileşimde menü açılıp açılmayacağını belirlerken; ışın takibinde yansıma/kırılma dallanmasını tetikleyebilir. Yani kesişim cevabı, iki farklı alt sistemin ortak girdisi olur.

Mesafe hesabı: t ve closest hit

Ray Intersection Playground — aynı ışın birden fazla nesneye çarpabilir. Seçilen vuruş = en küçük pozitif t (closest hit).

Closest hit

Adaylar · t’ye göre sıra

    Görünüm
    Gelişmiş · nesneyi yok say

    Aday kümesini elle daraltırsanız «aday yok» durumunu deneyebilirsiniz. Katman maskeleri için bölüm 3.

    Kesişim testinde t, ışının üzerinde «ne kadar ileri gittik?» sorusunun sayısal cevabıdır. Yön vektörü birim uzunluktaysa, bulunan t çoğu zaman köken ile çarpışma noktası arasındaki doğrudan mesafe olarak okunur; bu yüzden motorlar aday vuruşları t üzerinden sıralamayı sever. Yön birim değilse t yine de aynı ışın boyunca tutarlı bir sıra üretir — sadece rakamı «metre» gibi yorumlamak zorlaşır. Ayrıntılı işaret ve aralık yorumu için Işın ve t’nin anlamı sayfasına bakın; burada kesişim seçiminde nasıl kullanıldığını sadeleştiriyoruz.

    Aynı ışın, sahne boyunca birden fazla yüzeyle kesişebilir; algoritma da birden fazla t üretebilir. Soru şudur: hangi vuruş «ilk temas» sayılır? Bu ilişkiyi doğrudan görmek için Ray Intersection Playground etkileşimini kullanabilirsiniz. Görünürlük, seçim veya basit «ilk engel» senaryolarında klasik kural şudur: filtreler (katman/etiket) uygulandıktan sonra kalan adaylar arasından en küçük pozitif t değerine sahip olan «closest hit» (en öndeki çarpışma) seçilir. Bu, derinlik tamponu (Z-buffer) fikrinin ışın dünyasındaki karşılığıdır: önde olan kazanır.

    • Neden pozitif? Çoğu uygulama, kameranın «arkasında» kalan veya ışının geçmişine düşen vuruşları eler; böylece kullanıcıya dönük seçim stabil kalır.
    • Eşitlik ve sayısal gürültü: İki yüzey aynı t’ye çok yakınsa, hangisinin «kazandığı» küçük farklarla oynayabilir. Üretimde genelde ek bir öncelik (yüzey kimliği, sabit sıra, kullanıcı tanımlı kural) veya epsilon eşiği eklenir.
    • Şeffaf / özel kurallar: Bazı yüzeyler seçimde yok sayılır; o zaman «en küçük pozitif t» kuralı aynı kalır ama aday kümesi önce değişir — yani seçim, geometriden önce tanımlanan sözleşmeyle şekillenir.

    Sonuç: hit record (çarpışma paketi)

    Başarılı bir kesişim testi sonucunda motor, render/fizik/AI gibi bileşenlerin tüketebileceği bir veri paketi döndürür. Aşağıdaki tablo, yaygın alanların «ne olduğunu» ve «ne işe yaradığını» özetler.

    Veri alanı Açıklama Kullanım
    Hit point (P) Işının objeye değdiği tam 3B koordinat. Efekt yerleşimi (kurşun izi, kıvılcım), ölçüm, etkileşim konumu.
    Distance (t) Kaynaktan çarpışma noktasına parametre/mesafe. Sis, zayıflama (attenuation), sıralama/closest hit.
    Normal vector (N) Çarpılan yüzeyin dışa bakan dik yönü. Işıklandırma, yansıma yönleri, fiziksel tepki.
    UV coordinates Çarpılan noktanın doku üzerindeki 2B karşılığı. Kaplamanın doğru örneklenmesi, decal yerleşimi.
    Object reference Çarpılan nesnenin kendisi / kimliği. «Bu duvar mı, düşman mı?» sorusunun yanıtı; oyun mantığı/etiketleme.

    Optimizasyon: erken çıkış ve uzamsal bölme

    Büyük sahnelerde binlerce objeyi kontrol etmek performansı düşürür. Bu noktada iki kritik teknik devreye girer:

    1) Backface culling: “arkadan gelen vuruşu sayma”

    Üçgen tabanlı geometride her yüzeyin bir ön ve arka tarafı vardır; bu ayrım, üçgenin köşe sırası ve normal yönü ile tanımlanır. Eğer amacınız ekranda görünen «ön yüzeyi» seçmekse, arkaya bakan yüzeyler çoğu zaman anlamsız aday hâline gelir. Bu durumda backface culling, kesişim testi daha üçgenin içine girmeden “erken eler”.

    • Ne zaman güvenlidir? Tek taraflı geometri (duvar, zemin, kabuk) ve kullanıcı etkileşimi / picking senaryolarında genelde güvenlidir: «kamera görmüyorsa seçme» kuralı ile uyumludur.
    • Ne zaman tehlikelidir? Çift taraflı materyaller, ince yüzeyler (yaprak, perde), iç hacimden bakılan sahneler veya “içeriden” vuruşların anlamlı olduğu fizik senaryolarında arkayı elemek yanlış negatif üretebilir.
    • Motor sözleşmesi: Culling, bir doğruluk tercihi değil; “hangi vuruşlar raporlanmalı?” sözleşmesidir. Bu yüzden katman/etiket ile birlikte düşünülür: bazı ışınlar iki tarafı da görür, bazıları yalnızca ön yüzeyi.

    Not: Culling, closest hit seçimini de hızlandırır; çünkü gerçekte raporlanmayacak adayları daha baştan düşürürsünüz.

    2) Spatial partitioning: sahneyi “adreslenebilir” kılmak

    Broad-phase’i tek bir obje düzeyinde kurmak yetmez; sahnenin tamamında «binlerce aday» ile başa çıkmak için uzayı da organize etmek gerekir. Uzamsal bölme, sahneyi hücrelere veya ağaç yapılarına ayırıp, ışının yalnızca geçtiği bölgelerdeki adaylarla uğraşmasını sağlar. Bu fikir, “kaba test → ince test” modelinin sahne ölçeğinde sistemleştirilmiş hâlidir.

    • BVH (bounding volume hierarchy): Objeler veya üçgen kümeleri, üst üste binen kutular altında hiyerarşik olarak toplanır. Işın önce büyük kutuları test eder; çarpmıyorsa o alt ağacın tamamı elenir. Çarpıyorsa, kutular küçülerek daralır ve en sonunda dar faz (üçgen) testine inilir.
    • Octree / grid: Uzay, bölümlere ayrılır; ışın hangi hücrelerden geçiyorsa o hücrelerdeki adaylar test edilir. Düzenli haritalarda veya geniş alanlarda, bu model “hangi bölgede kim var?” sorusunu çok hızlı çözer.

    Performansın kritik detayı şudur: eğer hedefiniz yalnızca smallest positive t (closest hit) ise, uzamsal yapılar traversal sırasında erken çıkış imkânı verir. Bir aday vuruştan sonra bulunan t değeri, sonraki kutu testleri için bir “tavan” olur; bu tavanın ötesindeki kutular otomatik elenir. Böylece ışın, doğru cevaba yaklaştıkça arama alanını kendiliğinden daraltır.

    • Dinamik sahneler: Sahnede objeler çok hareket ediyorsa, BVH güncelleme maliyeti devreye girer; bazı motorlar “yeniden inşa” yerine “refit” gibi güncelleme stratejileri kullanır.
    • Üretim pratiği: Etkileşim amaçlı ışınlar genelde az sayıda ve hedeflidir; bu yüzden doğru uzamsal yapı, “her karede binlerce ışın” atmadan da fark yaratır.

    Holodepth teknik notu

    Intersection test, 3B dünyada «gözlemci» ile «madde» arasındaki köprüdür. Testin hassasiyeti (precision), oyunlardaki vuruş hissiyatından (hitbox) mimari görselleştirmelerdeki ışık doğruluğuna kadar pek çok şeyi doğrudan etkiler. Bu yüzden performans kadar tutarlılık (epsilon, normal yönü, closest hit kuralı) da üretim kalitesinin parçasıdır.