Sürekli Fizik Motoru Çarpışma Tespit Teknikleri


10

Tamamen sürekli bir fizik motoru üzerinde çalışıyorum ve geniş ve dar faz çarpışma tespiti için algoritmalar seçmem gerekiyor. "Tamamen sürekli" demek asla kavşak testi yapmam demek, bunun yerine her çarpışmayı gerçekleşmeden yakalamanın yollarını bulmak ve her birini TOI tarafından sipariş edilen "planlanmış çarpışmalar" yığınına koymak istiyorum.

Geniş Faz Düşünebildiğim tek sürekli geniş faz yöntemi, her bir gövdeyi bir daireye yerleştirmek ve her dairenin bir diğerinin üzerine binip geçmeyeceğini test etmektir. Ancak bu oldukça verimsiz görünüyor ve herhangi bir itlaftan yoksun.

Dörtlü ağaçlar gibi günümüzün ayrık çarpışma ayıklama yöntemleri için hangi sürekli analogların var olabileceği hakkında hiçbir fikrim yok. Ayrık bir motor gibi uygunsuz ve anlamsız geniş testlerin önlenmesine nasıl devam edebilirim? Ayrıca 1 kareden daha fazla çarpışmayı da görmek istiyorum.

Dar Aşama
Dar SAT'ı ayrık değil sürekli bir denetime uyarlamayı başardım, ancak eminim orada karşılaşacağınız kağıtlarda veya sitelerde başka daha iyi algoritmalar var.
Hangi çeşitli hızlı veya doğru algoritmaları kullanmanızı öneririm ve her birinin avantajları / dezavantajları nelerdir?

Son Not: Algoritmalar değil teknikler
diyorum çünkü içbükey, dışbükey, yuvarlak ve hatta delikleri olan farklı çokgenleri nasıl saklayacağım konusunda henüz karar vermedim. Algoritmanın gerektirdiğine göre buna karar vermeyi planlıyorum (örneğin, bir çokgeni üçgenlere veya dışbükey şekillere ayıran bir algoritma seçersem, çokgen verilerini bu formda saklayacağım).



Eklediğim için üzgünüm, ama neden Box2D kullanmıyorsunuz? Neredeyse her dile taşındı. Kullanmayı planlamıyorsanız, neden kaynağını nasıl yönettiğini görebilmeniz için neden kaynağına göz atmıyorsunuz?
Derek

Yanıtlar:


2

Buraya gerçekten sadece fikirler veriyorum. (En azından) currentkonumunuz ve nextkonumunuz olduğunu varsayarsak ; her çerçeve için.

İki ayrı geniş faza, ardından da dar fazınıza ihtiyacınız olacak:

  • Bir çarpışma olacağını anlayan.
  • Çarpışmanın gerçekte nerede meydana geldiğini anlayan bir örnek (örneğin, geniş bir faz / yanlış SAT)
  • Son olarak, dar evreniniz ikinci geniş evrenin sonucunu iyileştirecektir.

İlk Geniş Faz

İlk geniş faz için mekansal hash ( nextpozisyonu kullanarak değil current) içine bakabilirsiniz . Bu sorun alanınızı güzelce çarpışma adayları gruplarına ayıracaktır.

İkinci Geniş Aşama

Açıkladığınız daire kesişim yöntemini kullanarak bir ikili çoklu örnekleme yapın. Başka bir deyişle:

left = current
right = next
midpoint = (left + right) / 2
loop a desired amount of times tweaked to the accuracy you want:
  is a collision occuring at midpoint?
    right = midpoint
  else?
    left = midpoint
  midpoint = (left + right) / 2
pointOfCollision = midpoint

Bu doğruluk ayarlaması da mesafe alabilir - bence 'kare kare' kullanmak next - currentpiksel mükemmel bir sonuç elde edeceğini düşünüyorum .

Dar Faz

PMask gibi bir şey kullanarak ikili bir çoklu örnekleme yapın - mantık yukarıdakiyle tamamen aynı olacaktır; sadece farklı bir çarpışma rutini kullanarak.

En sonunda

Sen gelen zaman-of-kesiştiği çalışmak mümkün olacak pointOfCollision, currentve mevcut speedve acceleration(makul bir entegratörü olduğu varsayıldığında).


İkincil geniş faz tespiti için, dairenin hareket yolunun orta noktasını almamı ve test edilmekte olan dairenin içinde olup olmadığını test etmemi önerir misiniz? İki çemberin zaman içinde birbirinden uzaklaşmasını sağlayan bir denklem oluşturabileceğimi düşünüyordum ve herhangi bir zamanda mesafenin 0'a eşit olup olmadığını görüyordum
Griffin

Ayrıca, Pmask tam olarak ne yapar? site gerçekten açıklamıyor = /.
Griffin

@ Griffin ilk yorumunuz işe yarayabilir - anlayabiliyor musunuz bakın. Temelde bir çarpışma alanı üzerinde ikili bir arama yapıyorum ... PMask oldukça zeki. İmzasız bir 64-int'i 8x8 piksel ızgara (açık / kapalı) olarak görme - basit bir AND (ikili) bir çarpışma olup olmadığını belirler (sıfır olmayan); önce biraz akıllıca bir şey yapmanız gerekiyor, ama fikir bu. Daha fazla bilgi için kaynağı okuyun; Burada açıklamak zor (ya da açıklamam berbat olurdu) - gerçekten kaynağa başvurmanız gerekir.
Jonathan Dickinson

1

Pekala, sorunuzu daha spesifik olacak şekilde güncellediğinizi gördüm. Size biraz daha yardım etmeye çalışacağım.

İlk geniş faz kontrolünüz için, mekansal hash şiddetle tavsiye ediyorum .

Esasen, ekranınızı eşit boyutlu ızgaralara böldünüz. Daha sonra, nesne bir ızgara içinde yer alıyorsa, nesneyi 1D karma tablosundaki bir "kovaya" eklersiniz.

Bu senin ilk kontrolün. Nesneler aynı kovada değilse, kesişmeleri imkansızdır.

Bununla devam ederseniz, şimdi içinde nesneler bulunan (potansiyel olarak) bir kova listesine sahipsiniz. Burada aşağıdakilerden birini yaparak başka bir geniş faz kontrolü yapabilirsiniz:

A.) Bu kovayı diğer 4 kovaya bölmek ve ortaya çıkan 1D karma tablosunu kontrol etmek. Aynı kovada değillerse, çarpışma olmaz.

Veya:

B.) Doğruluğu sağlamak için basit bir mesafe kontrolü yapmak ve nesnenin genişliğini ve / veya yüksekliğini göz önünde bulundurmak.

Ama potansiyel olarak bir çarpışmanız olduğunda ne olacak?

Sonra çizgisinde bir şey tavsiye ederim bu . Temelde çokgen çarpışma (karmaşık şekiller için) veya daha az karmaşık şekiller için dikdörtgen / daire arasında bir çeşit karışımdır.

Ayrıca, "çarpışmaları gerçekleşmeden önce yakalamak ve saklamak" istiyorsanız, her zaman böyle bir şey yapabilirsiniz:

İki nesne aynı gruptaysa, çarpışabilirler.

Dahası, nesneler yakında çarpışabilecekleri kadar yakın mı? (Hız, nesne boyutu ve mesafeyi dikkate alarak)

Her ikisinin de cevabı evet ise, devam edin ve daha sonra bir kavşak testi yapmak için saklayın.


" Eski cevap

Ne yazık ki, "Tüm Çarpışma Türleri ve Ne İçin Kullanılırlar" El Kitabımın kaydını kaybettim. :)

Ancak, bu son derece geniş bir soru olsa da, başlayacağım.

Burada böyle bir şeyle ilgili iyi (cevaplanmış) bir soru var .

Buraya N ve N + yapan insanların bir makalesinin yanı sıra .

Bahsetmemek gerekirse, piksel başına iyi Çarpışma var .

Herkesin her türlü çarpışma için kullanışlı bir listeye sahip olacağından içtenlikle şüpheliyim, ancak bu başlamanıza yardımcı olacaktır.

Ancak, ihtiyaç duyduğunuz (ve sonuçta ortaya çıkacak) çarpışma türünün büyük ölçüde oluşturduğunuz oyun türüne bağlı olduğunu belirtmeliyim. Bu yüzden öğreticiler buluyorsunuz - çoğu insan ne istediğiniz hakkında bir fikriniz olduğunu varsayar, bu yüzden o alanda size yardımcı olurlar. Bağlantılarımın çoğunun belirli bir konuda öğretici olduğunu anlıyorum, ancak bir öğreticinin size daha fazla yardımcı olacağını düşünüyorum. Liste bir şeydir, ancak her bir kurşun noktasını kendiniz okursanız, ihtiyaçlarınızı daha spesifik olarak karşılayacak daha eğitimli bir karara gelebilirsiniz.


Çarpışmamı temel aldığım yöntemi eklemeyi unuttum (Gövde Tasarımı kullanarak Piksel Başına) Arşivi affedin, orijinal site web sitesi cennetine gitti. web.archive.org/web/20090126230334/http://www.ziggyware.com/…
electroflame
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.