Şimdi Ara

Çarpışma Algılama

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
13
Cevap
0
Favori
1.397
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhabalar,
    Bir süredir oyun programlamaya çalışıyorum henüz birşey başaramadım malesef, bu alanda en son hamlem Unity 3D öğrenmek oldu, halen öğrenmeye çalışıyorum. Neyse konuya geleyim, oyun programlamaya ilk girdiğimden beri bu çarpışma alanı hep beni zorlamıştı. Şimdiye kadar Rectangle Collision'dan başka hiçbir şey bilmiyordum, halen bilmiyorum, yalnız okuduğum kadarıyla genel olarak çarpışma algılama nesneleri şekillere benzeterek yapıldığı. Şimdi bu noktada aklıma bir fikir geldi, fikir denmeyebilir düşünce. Şimdi ilk olarak çarpışma algılamanın öncesi var, iki nesnenin çarpışabilmesi için birbirine yakın olması gerek örnek olarak verir isek;
    Nesne1 ve Nesne2 nesnelerimiz olsun,
    Eğer Nesne1'in Merkez Noktası ile Nesne2'nin merkez noktası arası uzaklık Nesne1'in boyutu + Nesne2'nin boyutu 'nun yarısından büyük ise bu iki nesne çarpışamaz.(Henüz doğruluğunu test etmedim, ispatlamadım, ama mantıken böyle oluyor).
    /Basit olarak : if(merkezlerarasiuzaklik>(n1.Boyut+n2.Boyut)/2)){ÇARPIŞMAVAR;}
    Bunu test ettikten sonra bu iki nesnenin çarpışma durumu;

    Bu noktada aklımda iki fikir var,

    birisi muhtemelen şuan kullanımda olan, nesneleri şekillere benzetmek, bu noktada aklıma gelen şey şu, verilen Bitmap'in geçirgen olan renkler dışında her pixelini bir renge boyamak, bu aşama bir sonra bu nesneden kare dikdörtgen vb. olarak çıkartılan şekilleri bitmap üzerinde farklı bir renkte göstermek böylece bir daha aynı yeri şekle benzetmeye çalışmayacak, sonra bunları bir diziye aktaracak ve bu şekilde tutacak (Bu işlemler programın açılış bölümünde bir kereye mahsus olacak şekilde yapılmalı). Daha sonra'da bu şekillerin kenarları ile ilgili bir bağıntı ile çarpışmayı kontrol etmek;
    Şu şekilde oluyor;
    Mesela bir üçgen düşünün her bir kenarının doğru denklemini bulmak çok basit bir işlemdir (Köşeleri iki nokta olarak aldığınızda (y2-y1)/(x2-x1)=(y-y2)/(x-x2) gibi bir bağıntıdan doğru denklemi bulunur. Şimdi diğer şeklin herhangi bir kenarının da aynı şekilde doğru denklemini bulalım. Daha sonra yapmamız gereken bu iki doğrunun kesişim noktasını bulmak, x'ler eşitlenir vb. işlemler ile. Daha sonra bu yeni kesişim noktası (x3,y3) olsun. Bu noktanın birinci şeklin aldığımız kenarın orta noktasına uzaklığı eğer o kenarın uzunluğunun yarısından küçük ise bu iki şekil çarpışıyor demektir. Mesela bir dikdörtgen ve bir üçgen için 3*4'ten 12 kere dönecek toplamda iki döngü olur. Bu işlem ne kadar kasma yapar bilemem onu da zaman gösterecek.


    ikincisi ise yine bütün pixelleri aynı renge boyadıktan sonra pixeller ile çarpışma algılamak ama bunun fazla işlem gerektireceğinden kullanışlı olmayacağını düşünüyorum (Ama olursa çok daha kaliteli şeyler ortaya çıkabilir hiç hatasız çarpışmalar, iç içe geçmeyen eller kollay gibi..)

    Ve en son çarpışmadan sonra momentum çarpışma formüllerine göre bir sonuç olmasını düşündüm. Bu projede yerçekimi kullanmak yerine temel çekim kanunları kullanıp bir dünya koymayı düşündüm. Böylece yerçekimi kendiliğinden oluşacak. Şimdilik düşündüklerim bunlar, üşenmeyip okuyanlara ve okumayanlara teşekkür ediyorum. Eleştirilerinizi, cevaplarınızı bekliyorum.







  • çarpışma algılıma da şekillerle çalışırsan daha iyi olur, aslına bakarsan herşey analitik geometride bitiyor örnek verecek olursak iki çemberin çarpışmasını algılamak için

    r yarıçaplı iki cemberimiz olsun birincisinin kordinatları x1,y1 ikincisinin x2,y2 olsun, iki noktanın birbirine uzaklığı uzaklığı d=((x1-x2)^2-(y1-y2)^2)^1/2 dir

    eğer d<2r ise çarpışma vardır.
  • quote:

    Orijinalden alıntı: est2006

    çarpışma algılıma da şekillerle çalışırsan daha iyi olur, aslına bakarsan herşey analitik geometride bitiyor örnek verecek olursak iki çemberin çarpışmasını algılamak için

    r yarıçaplı iki cemberimiz olsun birincisinin kordinatları x1,y1 ikincisinin x2,y2 olsun, iki noktanın birbirine uzaklığı uzaklığı d=((x1-x2)^2-(y1-y2)^2)^1/2 dir

    eğer d<2r ise çarpışma vardır.

    Başladım yapmaya bakalım sonuç ne olacak, peki Bitmap'i şekillere dönüştürme konusunda fikrin varmı?
  • Olayın arkasındaki mantığımı çözmeye çalışıyorsunuz bilmiyorum ama, fizik motoru kullanılarak çarpışma olup olmadığı kolaylıkla anlaşılabilir. Tabi birde fizik motoru kütüphanesi öğrenmek gerekecektir bu durumda.
  • Genel olarak öyle denebilir fizik motoru kullandım daha önce ama kendimi geliştirme açısından neden kendiminkini geliştirmiyeyim (çalışmayayım?) :) Benim bakış açım bu, hiçbir zaman profesyonel şirketlerin yaptığı gibi bir fizik motorum olmaz ama işimi görecek seviyeye getirebilirim diye düşünüyorum.
  • Olabilir tabi neden olmasın. Hazıra konmamak her zaman iyidir. Başarılar.
  • quote:

    Orijinalden alıntı: leventg

    Olabilir tabi neden olmasın. Hazıra konmamak her zaman iyidir. Başarılar.

    Teşekkürler
  • ben hep pixel perfect çarpışma kodlamışımdır ana karakter için. diğer nesneler çarpışmasını ise basit yuvarlak kare çarpışma algılarım ama ana karakter için daima kusursuz çarpışma kontrolü yaptırırım. bir bir pixellere ayır, transparan olmayıp çakışanı ara..
  • quote:

    Orijinalden alıntı: artariel

    ben hep pixel perfect çarpışma kodlamışımdır ana karakter için. diğer nesneler çarpışmasını ise basit yuvarlak kare çarpışma algılarım ama ana karakter için daima kusursuz çarpışma kontrolü yaptırırım. bir bir pixellere ayır, transparan olmayıp çakışanı ara..

    Performans nasıl oluyor bu şekilde?
  • ben hep c++ directx çalıştığım için bir performans düşüşü görmedim. ama olabilir de, kalabalık bir ortam olmadı çünkü. ana karakter sprite'ı düşük boyutluysa sıkıntı olmaz zaten hiçbir türlü
  • quote:

    Orijinalden alıntı: artariel

    ben hep c++ directx çalıştığım için bir performans düşüşü görmedim. ama olabilir de, kalabalık bir ortam olmadı çünkü. ana karakter sprite'ı düşük boyutluysa sıkıntı olmaz zaten hiçbir türlü

    Tamam anladım, kolay gelsin.
  • Tam olarak istediğini anlayamadım. Bir sürü çarpışma algılama algoritmaları var. Kendin araştırma yapmadan kendininkini mi oluşturmak istiyorsun yoksa var olanları öğrenmek mi?

    Bir süre ilki üzerinde durmanı öneriyorum aslında, ülkemizin yazılım konusunda ciddi bir yaratıcılığa ihtiyacı var, bakarsın daha kaliteli bir algoritma bulursun var olanlardan ;)
  • quote:

    Orijinalden alıntı: qamyoncu

    Tam olarak istediğini anlayamadım. Bir sürü çarpışma algılama algoritmaları var. Kendin araştırma yapmadan kendininkini mi oluşturmak istiyorsun yoksa var olanları öğrenmek mi?

    Bir süre ilki üzerinde durmanı öneriyorum aslında, ülkemizin yazılım konusunda ciddi bir yaratıcılığa ihtiyacı var, bakarsın daha kaliteli bir algoritma bulursun var olanlardan ;)

    Benim gibi bir acemi böyle birşey yapabilir mi? Sanmıyorum, ama yine de üzerinde çalışıyorum teşekkürler.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.