2D oyun çarpışma yanıtı: Belirli bir eksende SAT ve minimum yer değiştirme?


13

Yaptığım 2D oyunda bir çarpışma sistemi uygulamaya çalışıyorum. Ayırma ekseni teoremi ( metanet'in çarpışma öğreticisinde açıklandığı gibi), çarpışma algılamayı ele almanın etkili ve sağlam bir yolu gibi görünüyor, ancak kullandıkları çarpışma yanıtı yöntemini pek sevmiyorum. En az üst üste binme ekseni boyunca körü körüne yer değiştirerek, algoritma hareket eden nesnenin önceki konumunu göz ardı eder, yani durağan nesneye girdiği ve ardından dışarı çıktığı kadar çarpışmadığı anlamına gelir.

İşte bunun önemli olduğu bir duruma bir örnek:

Misal

Yukarıda açıklanan SAT yöntemine göre, dikdörtgen sadece hipotenüsüne dik olan üçgenden çıkar:

SAT Tarzı Yanıt

Bununla birlikte, gerçekçi olarak, dikdörtgen üçgenin sağ alt köşesinde durmalıdır, çünkü bu, yer değiştirme vektörü boyunca sürekli hareket ederse ilk çarpışma noktası olacaktır:

Gerçekçi Yanıt

Şimdi, bu oyun sırasında aslında önemli olmayabilir, ancak bu şekilde etkili yer değiştirmelerin etkili ve genel olarak elde edilmesinin bir yolu olup olmadığını bilmek isterim. Beynimi son birkaç gündür raflara atıyorum ve henüz pes etmek istemiyorum!

(StackOverflow'dan yayınlanmıştır, umarım bu kurallara aykırı değildir!)


Kurallara aykırıdır. Çapraz postalama.
AttackingHobo

Evet, StackOverflow'dan silin ve burada saklayın: P
TravisG

gamedev.stackexchange.com/questions/9144/… Buraya özel sorunuza cevap verdim.
ultifinitus

SO'dan silindi.
Archagon

Bir ödül başlat, archagon: P Aksi takdirde, zorunda kalabilirim. Bu soru gerçekten ilginç ve birkaç referans listelemekten daha fazlasını yapan bir cevap görmek harika olurdu.
TravisG

Yanıtlar:


11

İşte bulduğum yöntem. Kusurlu olabilir, ancak henüz lanetli analizimde herhangi bir sorun bulamadım. Ayrıca birkaç küçük değişikliğe sahip keyfi çokgenler için de çalışır.

Aşağıdaki resimlerde mavi nesne hareket etmektedir ve kırmızı nesne sabittir. 1 Adım 1: Her çokgen için, bu çokgenin hareket vektörüne dik çizgiye izdüşümü boyunca en uzak iki noktayı bulun. 2 Adım 2: Her bir çokgeni bu noktaları birleştiren çizgi boyunca bölün. Hareket vektörü boyunca diğer çokgene bakan çokgenin yarısı "ileri gövde" dir. Bu, çokgenin çarpışması muhtemel tek bölümüdür. 3 Aşama 3:Hareket vektörü boyunca her çokgenin "ileri gövdesi" üzerinde her noktadan bir vektörü zıt çokgene doğru yansıtın ve karşıt çokgenin "ileri gövdesi" nin her bir kenarı ile kesişme kontrolü yapın. (Muhtemelen yavaş, ama bugünlerde bilgisayarlar oldukça hızlı - değil mi?) (Eğik ok için üzgünüm. Tüm oklar paralel olmalıdır.) 4 Adım 4: En kısa vektörü alın. Bu tam çarpışma mesafesi. 5 Adım 5: Voila! 6


2
Bu oldukça etkileyici. Şansınızla algoritmanızın hızını basit (4x veya 8x) çoklu örnekleme ile karşılaştırdınız mı?
TravisG

Ne yazık ki hayır.
Archagon

Etkileyici ve eminim ki matematik de çok karmaşık / yoğun değil. +1
you786

7

Bu benzer soruyu inceleyin: Çarpışma Çözümü

Ve ayrıca, http://www.metanetsoftware.com/technique/tutorialA.html#section5 (ki buna bir bağlantı gönderdiniz :))

KISIM 5: Hızlı Hareket Eden Nesneler

Yukarıda belirtildiği gibi, küçük ve / veya hızlı hareket eden nesneler statik çarpışma testi kullanılırken sorunlara neden olabilir. Bu tür nesneleri işlemek için kullanılabilecek birkaç yaklaşım vardır - en basit olanı, oyun tasarımınızı bu tür nesnelere gerek kalmayacak şekilde kısıtlamaktır.

Kesinlikle onlara sahip olmanız gerekiyorsa, küçük ve / veya hızlı hareket eden nesnelerle başa çıkmak için iki yaygın yöntem vardır: çarpışma çarpışma testleri ve çoklu örnekleme.

- = tarama testleri = -

İki statik şekil arasındaki kesişmeyi test etmek yerine, orijinal şekilleri yörüngeleri boyunca süpürerek ve bu süpürülen şekiller arasında çakışma test ederek yeni şekiller oluşturabiliriz.

Daire fikri ve AABB-AABB tarama testleri için temel fikir [Gomez] 'de anlatılmıştır.

- = çoklu örnekleme = -

Süpürülmüş testlere çok daha basit bir alternatif çok örneklemedir; nesnenin yeni konumunda tek bir statik test yapmak yerine, nesnenin önceki ve yeni konumu arasında bulunan çeşitli konumlarda birkaç test gerçekleştirin. Bu teknik, N'de ragdoll ile çarpışmak için kullanıldı.

Örneklerin her zaman nesnenin yarıçapından daha kısa mesafelerde yerleştirildiğinden emin olursanız, bu mükemmel sonuçlar verir. Uygulamamızda maksimum örnek sayısını sınırlandırıyoruz, bu nedenle çok yüksek hızlar bazen sorunlara neden olacak; bu, özel uygulamanıza göre ayarlanabilecek bir şeydir.

DÜZENLE

Özet olarak ve AFAIK, birkaç çözüm var

  1. Oyununuzu asla buna neden olabilecek küçük ve / veya hızlı hareket eden bir nesneye sahip olmayacak şekilde sınırlayın
  2. Gönderdiğim ilk bağlantıda açıklandığı gibi, çarpışmaların gerçekte gerçekleşmesini engelleyen bir sistem uygulayın
  3. Hızlı ve / veya küçük hareketli nesneler için örnekleme oranınızı artırın
  4. ... muhtemelen daha fazlası, ama ben uzman değilim.

1

Bu sadece doğrusal hareket isteyip istemediğinize veya açısal hareketle de başa çıkmanız gerektiğine bağlıdır.

SAT kullanmaya alternatif:

Doğrusal durumda yalnızca nesnelerin delta doğrusal hızı yönünde başlangıçtan iki poligonun Minkowski Farkına karşı ışın dökebilirsiniz.

Işın MD'ye çarparsa, iki nesne çarpışır ve vuruş noktası çarpıştıkları zamanı size bildirir.

Şimdi, nesneler hareket edip dönüyorsa , daha zorlaşır, ancak yine de benzer bir teknik kullanabilirsiniz. Muhafazakar İlerleme, bu dava ile başa çıkmanıza izin verecektir. Bu teknik yinelemelidir; her yineleme yeni bir MD oluşturacak ve sizi kavşak zamanına yaklaştıracaktır.

İşte Muhafazakar İlerleme hakkındaki orijinal taslak makale:

http://www.continuousphysics.com/BulletContinuousCollisionDetection.pdf

Burada tekniği ayrıntılı olarak açıklayan bir makale yazdım:

http://www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/

Umarım bu yardım!

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.