Skip to main content

Nesne Carpışma Algoritmaları

Bu dönem aldığım Nesneye Yönelik Programlama dersinde verilen ödevler sayesinde yeni şeyler öğrenmeye devam ediyorum. Geçtğimiz haftalarda yaptığımız uygulamada Java Applet içersinde bir adet topu dolastırmıştık ve bu top appletin bir kenarına çartığında yön değiştirmişti. Bahsi geçen uygulamayı burada bulabilirsiniz.

Bu hafta verilen ödevde ise aynı yapıyı birden fazla top için yapmamız istendi. Bu uygulamanın kodlarını daha sonra paylasağım . Çünkü içersinde Threads yapısını kullandığımız için  onu ayrı bir paylasım konusu olarak düşündüm. Bu yazıyı ödevin bonus kısmı olan ” Topların Çarpışma” durumunu incelemek için yazma gereği duydum.

Oyun programlamanın temel taşlarından birisi şüphesiz ki  iki nesnenin çarpışma durumun tespitidir.  Peki bu olayın tespiti nasıl münkün oluyor ?  Şimdi bunları incelemeye çalişalım. Yapacağımız incelemeler 2D yani 2 boyutlu cisimler  için çözüm üretecektir.  Oyun  programlama dolayısıyla bu tip işler özel ilgi gerektiren yapılardır. Biz ise hali hazırda kullanılan algoritmaları kullanarak çözümler üretmeyi deniyoruz.    Bu tip uygulamaların iyi düzeyde Fizik ve Matematik bilgisi gerektirdiği akıllardan çıkarılmamalıdır. Ayrıca günümüzde orta büyüklükte bir oyun yazıkırken  bir Fizik Motoru kullanılır.  Bu tip motorlar sayesinde bir kaç ufak adımla  çarpışmalar çok rahat bir biçimde tespit edilebilir. Fakat biz kendimizin ufak çaplı bir oyun yazmaya calıştığını ve nesnelerin çarpışma durumun tespit edilmesi gerektiğini  varsayalım. Nasıl bir yaklaşımla bunları tespit edebiliriz.

1- Kare Yada Dikdötrgen Yapılarda Çarpışma Kontrolü :

Eğer bu iki nesnenin X koordinatları arasındaki fark, genişliklerinin yarılarının toplamından küçük ise ve iki nesnenin Y koordinatları arasındaki fark, yüksekliklerinin yarılarının toplamından küçük ise, bu iki dörtgen üst üste gelmiş dolayısıyla çarpışma (Collision) gerçekleşmiş demektir. 

 

Olayı matematiksel olarak modellemek için aşağıdaki yapıyı inceleyelim.

Burada, her iki dörtgenin ekranın sol üst köşesine olan uzaklıkları ve genişlik ile yükseklikleri belirtilmektedir. Elbette bir nesnenin X koordinatı uygulamada bu nesnenin Left özelliğinin değerine, Y koordinatı ise Top özelliğinin değerine işaret etmektedir. Aynı şekilde genişlik için Width, yükseklik için ise Height özelliklerinden yararlanılacaktır. Yukarıda bahsettiğimiz çarpışma koşulunun matematiksel ifadesi ise aşağıdaki gibi olacaktı

 

 

2-Dairesel Yapılarda Çarpışma Kontrolü :

Dairesel yapılarda çarpışma kontrolü yapılırken aşağı yukarı hepimizin fikri sahibi olduğu “Pisagor Teoremi”nden yararlanılır.  Dairelerin merkezlerinin birbirine olan uzaklıkları ile yarı capları toplamlarının   karşılaştırılarak bir sonuca varabiliriz. Eğer  doğrusal uzaklık , dairelerin yarı çapları toplamından küçük ise bu iki dairesel cisim çarpışmıştır diyebiliriz.

Aşağıdaki şekil üzerinde modelleme yapmaya çalışalım.

 

  • Burada bizim için anahtar şekil, dairelerin merkezleri arasında oluşan BMA dik üçgenidir. Biz bu üçgen yardımıyla, A ve B noktaları arasındaki mesafeyi, başka bir deyişle BMA üçgeninin hipotenüsünü bulabiliriz. Bu bizim için en kilit noktadır. Sonrasında ise, bu mesafeyi Ra ve Rb yarıçaplarının toplamı ile karşılaştırmamız yeterli olacaktır. Dolayısıyla çarpışma formülümüz aşağıdaki gibi olmalıdır.


     

Şekilden hareketle formül aşağıdaki gibi çıkartılabilir.

 

En basitinden iki çarpışma algoritması bu şekilde  tanımlanmıştır.  Tabiki de daha karmaşık ve dolayısıyla daha hassas olarak çalışan algoritmalarda vardır.  Fakat bizim yapacağımız küçük çaplı uygulamalarda bu algoritmaları kullanmak yeterli olacaktır.

Bu konuda çok geniş miktarda Türkçe kaynak   yok. Fakat bir çok yabancı sitede bu tip uygulamalar işlenmiş.  Özellikle  aşağıdaki internet sayfasına göz atmanızı şiddetle öneririm .

http://stackoverflow.com/questions/345838/ball-to-ball-collision-detection-and-handling

 

 

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Aytaç Cici

İstanbul Üniversitesi Bilgisayar Mühendisliği mezunu bir Yazılım Geliştirici. Çeşitli zamanlarda Java, PHP, C# ve Delphi gibi diller kullanarak yazılım geliştirmiştir. Bir dönem SEO alanında da çalışmalar yapmıştır.

Nesne Carpışma Algoritmaları” hakkında 1 yorum

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Email
Print