holodepth

Babylon.js · Fizik

Kolizyon mantığı: görünüş ile çarpışma ayrımı

Holodepth Three.js tarafında ışın–üçgen kesişimi ve sahne grafiği üzerinden seçim sık işlenir; fizik motoru ise başka bir soruya yanıt verir: hangi sınırlayıcı geometriler birbirine temas ediyor? Babylon.js bağlamında kolizyon «doğru görünür mü?» sorusundan önce hangi gövde şekli ile temsil edildiği sorusunu çözer — çünkü render örgüsü ile çarpışma örgüsü aynı maliyette ve aynı doğrulukta olmak zorunda değildir.

Bu sayfa motor API ezberi değil, üretim kararlarıdır: primitif seçimi, bileşik gövdeler, tetikleyici hacimler ve filtreleme. Özel yapılar (konveks kısıtı, tetikleyici vs katı) tek tek açık bırakılmadan işlenir.

Özet: kolizyonu oluşturan dört karar

Karar Ne belirler? Yanlışta ne görünür?
Şekil sınıfı Kutu mu, küre mi, konveks kabuk mu, üçgen ağı mı? Hayalet temas, iç içe geçme, kaygan zemin.
Çözünürlük Ayrıntı seviyesi veya basitleştirilmiş örgü. Küçük çıkıntılarda takılma veya gereksiz maliyet.
Etkileşim türü Katı temas mı, yalnız olay üreten tetikleyici mi? İtmeyen «duvar» veya sürekli tetik spam'i.
Filtre Hangi çiftler birbirini test eder? Yanlış çarpışma veya hiç çarpışmama.

Görsel örgü ile çarpışma geometrisi

Ekranda gördüğünüz yüksek poligon model, fizik motoruna «aynen» verilmez: çarpışma geometrisi çoğu zaman daha kaba ve daha stabil bir yapıdır. Sebep maliyettir: karmaşık üçgen ağı üzerinde sürekli temas çözümlemek CPU ve motor içinde darboğaz olur. Üretim kuralı: oyuncunun gördüğü ile çarpıştığı arasında küçük bir fark kabul edilir; kabul edilemez fark ise tasarım hatasıdır.

Özel yapı: «yüksek çözünürlüklü mesh kolizyon» bazı motorlarda mümkündür fakat konveks / konkav kısıtlarıyla gelir — iç içe oyuklar, ince parmaklar veya tek kapalı örgü yerine birden çok parça gerektiren modellerde hayalet çarpışma riski artar. Bu yüzden karmaşık varlıklarda çoğu zaman bileşik primitifler veya önceden üretilmiş konveks parçalar tercih edilir.

Primitif şekiller: hız ve doğruluk dengesi

Kutu, küre, kapsül ve silindir gibi şekiller matematiksel olarak ucuzdur; çarpışma testleri kapalı formülle yapılabilir. Bu yüzden karakter gövdeleri için kapsül, dünya zemini için kutu blokları gibi kalıplar yaygındır. Küresel kolizyon «her yönde simetrik» olduğundan köşeli nesnelerde görsel ile uyumsuzluk doğurabilir — düzeltme ya daha iyi uyumlu primitif seçmek ya da çoklu parça kullanmaktır.

  • Küre / kapsül: hareketli karakter omurgası için sık; merdiven ve düşük tavan köşelerinde ayar gerekir.
  • Kutu: mimari blokout, raflar, basit platformlar.
  • Konveks kabuk: özet geometri; konkav iç oyukları tek parça ile temsil etmek zordur.

Bileşik gövdeler ve tetikleyici hacimler

Bileşik kolizyon, tek mantıksal nesnenin birden fazla primitifle temsil edilmesidir — örneğin gövde küresi + baş küresi. Parçalar arası boşluk bırakılmazsa titreşim ve çıngırak oluşur; fazla örtüşürse gereksiz iç çarpışma kuvveti üretir.

Tetikleyici (çoğu sistemde «duyarlı hacim» / sensor), fiziksel itiş üretmeden «giriş–çıkış» olayı üretir: kapı alanı, kontrol noktası, zarar bölgesi. Özel yapı: tetikleyici ile katı kolizyonu karıştırmak, oyuncunun beklenmedik şekilde durmasına veya olayların iki kez tetiklenmesine yol açar — üretimde bayraklar ve soğuma süreleri ( cooldown) ile birlikte düşünülür.

Katmanlar ve filtreleme: kimi kimi test eder?

Her çift nesneyi her karede denemek ölçeklenmez. Bu yüzden motorlar çarpışma grupları / maskeler veya benzeri filtreler sunar: örneğin karakter–zemin çarpışması açıkken karakter–karakter kapalı tutulabilir; roket–araç farklı bir maskeyle seçilir. Özel yapı: maskeyi «her şeye izin ver» bırakmak küçük projede işe yarar; içerik büyüdükçe gizli maliyet ve hata ayıklama zorluğu artar.

Sahne grafiğindeki görünürlük katmanları (görünürlük katmanları) ile fizik filtrelerini karıştırmayın; ikisi farklı boru hatlarıdır — aynı isim metaforunu paylaşsa da çözülen problem farklıdır.

Broad-phase ve narrow-phase (sezgisel okuma)

Motor önce düşük maliyetli bir aşamada «birbirine yakın olabilir mi?» sorusunu sorar ( geniş faz), sonra az sayıda aday çift için kesin test yapar ( dar faz). Naif yaklaşımda her çift her karede dar fazda denenir; bu O(n²) büyür. Üretimde motorlar uzamsal yapılar, uyku durumu (sleeping) ve filtrelerle geniş faz yükünü keser — böylece dar faz yalnız «gerçekten yaklaşmış» çiftlere harcanır.

Bu ayrım Holodepth'teki ışın–kesişim geniş/dar faz düşüncesi ile aynı ailedendir; ışın tarafındaki filtre ve bütçe disiplini Işın · filtre ve maliyet bölümünde açılır — burada tekrar etmiyoruz. Amaç ezber değil, neden basit kutu/küre kolizyonunun üretimde sevildiğini anlamaktır: geniş fazda daha az aday, dar fazda daha ucuz ve stabil bir geometri sorusu çıkar.

Dar fazda «yüksek çözünürlüklü üçgen örgü» kullanmak, görünür detay ile çarpışma doğruluğunu özdeş saymanın bedelidir. Çoğu oyunda çarpışma gövdesi kasıtlı olarak kaba tutulur; ince ayrıntı görüntüde kalır ( Görsel örgü ile çarpışma).

  • Geniş faz: «kim kiminle aday?» — hatalı filtre burada patlar, dar faz doğru olsa bile.
  • Dar faz: temas noktası, penetrasyon derinliği, sürtünme yönü — geometri ve malzeme parametreleri burada birleşir.
  • Tünelleme: ince nesne + büyük zaman adımı dar fazı zorlar; çözüm çoğu zaman hem gövde kalınlığı hem zaman adımı politikasını birlikte ele almaktır — bu sayfa motor zamanını anlatmaz.

Performans ipucu

Binlerce ince üçgenli tek mesh yerine birkaç kutu, küre veya kapsül bileşeni hem dar fazı ucuzlatır hem tasarımı öngörülebilir kılar. Konveks parça sayısını bilinçli tutmak, «her köşeyi çarpıştırayım» eğiliminden daha sık kazanır — konkav özel durumda bileşik gövde desenine dönmek daha güvenlidir.

Babylon.js tarafında: gövdeyi sahneye bağlamak

Kavramları seçtiniz; sıradaki pratik adım genelde bu geometrileri sahne nesnelerine motorun tanıdığı köprü düzeniyle bağlamaktır. Babylon.js dünyasında bu köprü sıklıkla impostor düşüncesi ile ele alınır — yani görünür mesh ile fizik gövdesinin eşlenmesi. Dönüşüm (konum, dönüş, ölçek) hangi düğümden okunur, gövde hangi dünyada kayıtlıdır, yeniden boyutlandırma sonrası gövde güncellenir mi — bunlar köprü sözleşmesinin parçasıdır; yalnızca «kutu koydum» demek yetmez.

Aynı görsel örgü üzerinde birden fazla gövde (ör. gövde + tetikleyici) tanımlanacaksa, hangi gövdenin itiş, hangisinin olay üreteceği bu aşamada netleşmelidir; aksi halde impostor sayısı artar ama oyun mantığı dağınık kalır. Ayrıntılar bir sonraki sayfada: Physics impostor — bu sayfa API adımlarını kopyalamaz.

Köprü öncesi üç soru

  1. Fizik dünyası gerçekten başlatıldı mı ( Havok / Cannon entegrasyonu)?
  2. Görsel ölçek ile gövde ölçeği aynı sözleşmeyi mi kullanıyor?
  3. Filtre maskeleri beklendiği gibi mi ( Katmanlar)?

Three.js ile üst üste okuma

«Üst üste okuma» burada hangi sınıfı import edeceğiniz rehberi değildir. Three.js hattında çarpışma çoğu zaman Raycaster, üçgen kesişimi veya harici bir fizik paketi ile senin çağırdığın anda çalışır. Babylon üretim hattında ise aynı ihtiyaçlar, fizik dünyası adımı ve gövde yaşam döngüsü içinde paketlenir — kavram aynı, ne zaman ve kim tetikliyor farklıdır.

Çakışmayı önleyen çerçeve

Three.js öğrenirken çarpışma için sıklıkla Raycaster ve özel geometri testleri kullanırsınız — kontrol sizdedir. Babylon.js üretiminde ise kolizyon çoğu zaman motor içi fizik dünyası ve gövde soyutlaması ile yürür. İkinci yol ilkini iptal etmez; soru farklıdır: tek karelik seçim mi, sürekli dünya simülasyonu mu?

Işın tabanlı oyun mantığı için Holodepth Raycast ve çarpışma sayfası ayrı çizgidir; bu sayfa sürekli temas ve geniş/dar faz sezgisini sabitler — ikisini aynı «çarpışma modülü» sanmayın.

  • Tek kare: tıklama, hedef seçimi, görüş testi — ışın veya geometri testi yeterli olabilir.
  • Sürekli dünya: yerçekimi, itiş, istirahat hali — fizik gövdesi ve zaman adımı şart.
  • Hibrit: hareket fizikte, isabet seçimi ışında; veri sözleşmesini iki tarafta aynı tutun.

Sıradaki başlık

Kolizyon geometrisini seçtikten sonra teşhis ve kabuk görselleştirmesi için Debug visualization sayfasına geçebilirsiniz. Önceki adım: Texture sistemi.