2D çarpışma algılama


11

Bu karakteri kullandığımı varsayalım.

kuş
(kaynak: iconbug.com )

Bunun için çarpışma tespitini nasıl uygularsınız? Sınırlayıcı bir kutu kullanmak iyi bir yaklaşım gibi görünmemektedir, çünkü kuşun şekli bir kareye yakın değildir.

Görüntünün bölümlerini temsil eden nesnenin içinde bir tür dörtlü ağaç veri yapısına sahip olmayı düşünüyordum. Her yaprak ya false(kuş dışındaki beyaz / saydam alanı kaplaması durumunda) ya da true(kuşun gaga, göz vb. Bir bölgesini temsil etmesi durumunda) olabilir. Sonra bir şekilde kuşla çarpışma için sahnedeki tek engeli test edin .

Ama yaklaşımımdaki problemlerim:

  1. Dörtlü ağacın nasıl başlatılacağını bilmiyorum.
  2. Dört ağaç başlatıldıktan sonra, engel görüntünün koordinatları içinde olduğunda onu nasıl geçip kullanacağımdan emin değilim.

Kare olmayan karakterlerle çarpışma algılamayı nasıl yaparsınız?

LE: Gördüğüm diğer yaklaşım çoklu sınırlayıcı kutular kullanmaktı. Mesela gaga için bir ya da birkaç sınırlayıcı kutu, daha sonra da saç ya da kuyruk için bunlardan birkaçı olurdu. Ama sıkıcı olabilir. Bu benim durumumda geçerli bir yaklaşımsa, bu sınırlayıcı kutuları nasıl oluştururum? Programımda bunları kodlamam gerekeceğinden şüpheliyim.

LE2: Oldukça hassas çarpışmaları önemsiyorum. Tek bir sınırlayıcı kutunun veya dairenin en azından bu şekle nasıl yaklaşık olarak yaklaşabileceğini hayal edemiyorum, bu yüzden bu yaklaşım işe yaramayacak.


2
Genel bir not: Hem sınırlayıcı bir kutu hem de daha ayrıntılı bir denetim kullanacağım: Ayrıntılı denetim daha yüksek bir performans cezasına sahip olacak, bu yüzden mümkün olduğunca nadiren çalışmasını istiyorsunuz. Bu nedenle, önce sınırlayıcı kutuyu işaretleyin ve sadece vurulduğunda, daha derine inin ve daha ayrıntılı yaklaşımınızı test edin (ne olacaksa).
Philip Allgaier

Teşekkürler, yine de bunu yapmayı planlıyordum, ama 'granüler kontrolün' ne olması gerektiğinden tamamen emin değilim. :)
async

1
Tek önemli detay eksik: Bununla ne yapmak istiyorsun? Kesin çarpışmaları önemsiyor musunuz? Karaktere bir daire ile yaklaşmaktan mutlu musunuz? Toz parçacıklarının karakterin gözleriyle diğerlerinden ayrı olarak çarpışmasını ister misiniz?
Anko

@Anko Bu şekle bir daire ile nasıl yaklaşabilirsiniz? Oldukça hassas çarpışmalara önem veriyorum - gerçekten piksel hassas değil, ama iyi / doğal görünecek bir şey -.
async

1
Gibi bu . "İyi" ve "doğal" ne anlama geliyor? Bu felsefi bir soru mu?
Anko

Yanıtlar:


12

Daire çarpıştırıcısı. Fizikten etkilenen veya çarpışan doğal olmayan görünümlerle süslü bir şey yapmadıkça ve birkaç parçaya bölmeniz gerekiyorsa bile söyleyecek bir şeyim yok:

Aşırı karmaşıklaştırma.

Bunun için tam bir dörtlü ağaç yapısına ihtiyacınız yok. Düz bir dizide birkaç kutu veya daire bulun ve sonra hepsiyle kesişin. Bu muhtemelen yeterince performans kritik olamaz ve dört ağaç kullanmaktan o kadar fazla kazanamazsınız.


3
Evet, tek bir şekil onu kapsamazsa, birkaç şekilden oluşan küçük bir dizi yapın. Örneğin: i.imgur.com/Dd4yyGN.png
MichaelHouse

Teşekkürler Jonkel & @ Byte56. Benim durumumda birkaç şekil kullanmak doğru çözüm gibi görünüyor. Uygulaması kolay, doğru ve hızlı. Bunu düşünmeden doğrudan dörtlü ağaçlara atladığımıza inanamıyorum! Uh.
uyumsuz

Ekstra doğruluk için gövde için bir daire çarpıştırıcısı ve gaga için bir dikdörtgen.
Kroltan

14

İki adımlı kontrol süreci

İlk adımda sınırlayıcı kutuyu işaretlersiniz ve orada herhangi bir çarpışma olmazsa test sona erer. Çarpışma varsa, ikinci geçişe geçersiniz

İkinci geçişte , daha fazla hassasiyet istiyorsanız ve gerçek bir piksel mükemmel çözümü istiyorsanız, o zaman bunu yapabilirsiniz, piksel mükemmel bir kontrol geçişi

Resminiz bir PNG (veya alfa kanalı içeren başka bir dosya biçimi) olduğundan, bu oldukça kolay olurdu

  1. Sahnedeki bir nesne ile kuş arasındaki kesişim alanını hesaplayın ve her iki görüntüde de basit bir kesişim dikdörtgeni oluşturun
  2. Bu kavşak içinde, her pikselin HER İKİ resimde alfa değeri> 0 olup olmadığını kontrol edin
  3. Bu tür pikseller varsa, çarpışmanız var. Aksi takdirde hayır

Görüntü alfa kanalınıza bakarsanız, piksel mükemmel çarpışması için ihtiyacınız olabilecek tüm bilgilere nasıl sahip olduğunu görebilirsiniz.

görüntüden alfa kanalı

Piksel mükemmel çarpışmalar genellikle pahalıdır, bu nedenle ilk önce sınırlayıcı bir kutu veya daha ayrıntılı bir çarpışma figürüyle (Anko'nun önerdiği gibi) kaba bir tahmin yapmak size değerli bir zaman kazandırabilir

"Daha ince" detaylı çarpışma sınırlama kutusu Anko şunları önerdi:

daha ayrıntılı sınırlayıcı kutu

Not: Resminizde etrafında çarpışmak istemediğiniz bir hale, efekt veya 0 dışı alfa kanalı varsa, algoritma eşiği kolayca buna göre ayarlanabilir


1
Teşekkür ederim! Ama sonuçta mükemmel piksel hassasiyetine ihtiyacım olmayacak. Yine de mükemmel cevap, daha sonraki bir tarihte faydalı olacaktır.
async

Tabii ki dostum, evet, piksel mükemmel çarpışması neredeyse her zaman aşırıya
kaçıyor

3

Vücut için bir daire ve gaga için tek bir dikdörtgen kullanırdım, ama bu sadece benim görüşüm. Çarpışma geometrisinizi aşırı karmaşık hale getirmek uygulamanızı yavaşlatabilir, ancak ekrandaki karakter sayısını neredeyse iki katına çıkarırsınız (veya daha fazla).


0

Belki de bir çeşit sakat poligon / kenar çarpıştırıcı kullanabilirsiniz.

Bunun nasıl çalışacağından tam olarak emin değilim, ancak:

iki nesne: nesne 1: kuş (o1), nesne 2: kuşa vurabilecek şey (o2)

1) Söz konusu ilk nesneye (o1) yakından uyan çokgen olan sınırlayıcı bir şekil tanımlayın.

2) o1 kenarlarını, o2 al daha iyi olabilir makul çarpıştırabiliyordu olmadan makul çarpışır O2 geçen olmadan yoluyla tam tersi o1 veya yardımcısı.

Şeklin (o2) konumu ve boyutu ile, muhtemelen o2'ye yakın olan başka bir kenarın (o1) "arkasında" olduklarından emin oluncaya kadar, muhtemelen vurulamayacak kenarları (o1'in) izole edebilirsiniz. Hipotenüsü yukarı ve sağa bakan bir dikdörtgene ve düz olarak yaklaşan bir dikdörtgene sahipseniz (x ekseni boyunca uzun kenarı ile), başlangıç ​​ve bitiş y değerleri olduğu için hangi kenarların atlanacağını söyleyebilirsiniz. dikdörtgenin üstünde veya altında.

3) o2'nin kenarındaki noktalardan birinin, 2. adımda seçtiğiniz o1'in kenarlarındaki herhangi bir nokta ile aynı olup olmadığını belirleyin.

bu kavram muhtemelen çokgenleri çarpıştırmak için en iyi sonucu verir (yani açık kenarları olan şeyler), ancak bir daireye uzun bir kenar gibi davranabilirsiniz (örneğin o2 bir daire ise).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.