2B'de köşe çarpışmaları ile nasıl baş edilir?


22

2d XNA oyun bir üst yazıyorum. Benim ilk adımdan beri, onu öğrenmek için kendimi fizik ve çarpışma şeylerimi yazmaya çalışıyorum.

Ne zaman oyuncu sprite karakterim sınırlarının bir duvarın kenarı ile kesiştiği bir konuma hareket etmeye çalıştığında, bir sıçrama açısı belirledim (oluşum açısı = yansıma açısı) ve oyuncunun duvardan çıkmasını sağlarım ve çarpışmayı önlerim .

Sprite'ımın durumuyla aynı anda iki duvar kenarı ile kesişen durumlarla nasıl başa çıkacağımı bulmakta güçlük çekiyorum, örneğin köşeye çarpıyor.

köşe çarpışması

Kodum şu anda bana iki duvar kenarının kesiştiğini, ancak hangi kenara ilk önce çarpacağını ve dolayısıyla hangi kenarı atlayacağını söylüyor.

Hangi kenarı zıplayacağını seçmek için gereken matematiksel test nedir? Ona bakarken görmek basit ama bunun için matematik testini çözmek için mücadele ediyorum.



Teşekkürler Tetrad. Bunu gördüm ama top dikdörtgen şeklindeki sorunuma farklı davranacak gibi görünüyordu. Yukarıda resmedilmiş durumda dikdörtgen sprite, duvarın alt kenarına vuracak ve zıplayacaktır. Duvarın yan kenarı hiçbir zaman denklemde olmazdı. Sadece bunu kodda nasıl ifade edeceğimi ve bu kararı nasıl vereceğimi bilmiyorum.
TerryB

Yanıtlar:


9

Eğer ne kadar içine hesaplarsak taşındı, muhtemelen x delta ve kesişen köşelerinden y koordinatlarının üzerine dayandırabilirsiniz. Umarım bu mantıklı, bunu söylemenin daha iyi bir yolunu düşünemiyorum.WallPlayer Sprite

Örneğin, şemaya bakarsanız. (Hamleden sonra) xsol üst köşesinin değerini alın ve sağ alt köşesinin değerini Player Spriteçıkarın . Değerler için de aynı şeyi yapın ve hangisinin daha büyük olduğunu görün. Anahtar, birinin diğerinden daha büyük olması durumunda, muhtemelen o tarafta kesişmiş olmasıdır.xWallyPlayer Sprite

İşte bir resim örneği (bu, resmimin kendi çizgileri eklenmiş olarak bir alt bölümüdür):

kesişme örneği

Şimdi, burada mavi çizginin yeşil çizgiden daha büyük olduğunu görüyorsunuz. Bu durumda mavi çizgi aynı zamanda Player Spritezıplamasının bekleneceği taraftadır .

İki değer eşitse, tam köşeye çarparlar.

Şimdi, bu şekilde yapmakla ilgili ufak bir sorun var. Eğer Player Spriteçok hızlı seyahat ediyor veya çarpışma çok yakın köşesine, bu mümkündür Player Spriteiçine daha ileri gidebilir Wallyanlış yönde. Bu durumda, muhtemelen hareketli nesnenin hızını kontrol etmeniz gerekecektir. (Bkz. Nathan Reed'in cevabı .)

Not: Sanırım @Blau'nun bahsettiği SAT çarpışma algılamasını tanımlamaya çalışıyorum, ancak uzun zamandır bunu yazmak için çok zaman harcadım. Umarım size biraz yardımcı olur.


Teşekkürler Drackir! Ve sanırım duvarım sprite göre döndürülmüş ise biraz daha zor ama aynı prensip geçerli. Sprite'ın duvarla çarpışmayacağı anlamına gelen minimum uzunluk yer değiştirme vektörünü arayın. Sonra o vektöre normal olan duvarı zıpladığım gibi kullanın.
TerryB 21:11

@TerryB - Rotation ona biraz daha fazla karmaşıklık ekler. Eksen hizalı sınırlayıcı kutuları (AABB) okumak isteyebilirsiniz. Temel olarak, döndürülen nesnenin sığabileceği, ancak eksenleri kartezyen eksenlerle aynı hizada olan en küçük kutuyu test ederek hala aynı prensibi kullanırsınız. Bir kareniz olup olmadığını ve bir elmas yapmak için 45 derece döndürdüğünüzü hayal edin. Bunun üzerindeki çarpışmanın hesaplanması zor ve maliyetli olacaktır, bu nedenle ilk önce, elmasın her bir noktasının ortadaki her bir tarafa temas ettiği bir kare olan AABB kullanarak nesnenin kendisine yakın olup olmadığını kontrol edin.
Richard Marskell - Drackir,

Daha sonra, yakınında olduğunu bildiğiniz zaman, açılarla kesiştiklerini görmek için daha pahalı hesaplamalar yapabilirsiniz (bu muhtemelen bir bütün olarak bir başka soru olmalı :)).
Richard Marskell - Drakkir

1
-1 çünkü minimum yer değiştirme her zaman "hangi kenarı önce çarpıştı" diye doğru cevabı vermez; cevabımı gör.
Nathan Reed

@NathanReed - Bu yüzden "Şimdi, bu şekilde yapmakta ufak bir sorun var" paragrafımdaki hızı kontrol etmekten bahsetmiştim.
Richard Marskell - Drakkir

15

Asgari deplasman yok değil her zaman kenar ilk vuruldu kendisi için doğru cevabı verir. Bu durumu düşünün:

en kısa yer değiştirme algoritmasını kıran vaka

Bu, hız bir blok boyunca bir bloğun oldukça uzağa hareket etmesi için yeterince yüksek olduğunda meydana gelir. Önce hangi kenara çarptığını doğru bir şekilde saptamak için, her bir kenara çarpışma zamanı için çözmek üzere doğrusal bir denklem ayarlamanız gerekir. OP şemasında açıklanan bu durumda, ilgili denklemler şunlardır:

timeXCollision = (player.left - wall.right) / -player.velocity.x
timeYCollision = (wall.bottom - player.top) / player.velocity.y

(Bu bir X-sağ, Y-up koordinat sistemidir.) Genel olarak, hangi kenar çiftinin test edilmesi gerektiğini belirlemek için player.velocity'in X ve Y bileşenlerinin işaretlerini kullanmanız gerekir. Eğer çarpışma kez bilgisayarlı bir kez Neyse, daha önceki iki idare gerek çarpışma olduğunu.


1
İki değişkeninizin nasıl uygulanabileceğine dair bir örnek verebilir misiniz?
BjarkeCK

1

SAT Çarpışma Algılama'ya ihtiyacınız var

Temel olarak, nesnelerden birine çıkarılmış minimum yer değiştirme vektörünü aramanıza gerek yoktur;

Görüntünüzde minimum yer değiştirme turuncu segmenttir.

görüntü tanımını buraya girin


4
-1 çünkü minimum yer değiştirme her zaman "hangi kenarı önce çarpıştı" diye doğru cevabı vermez; cevabımı gör.
Nathan Reed

bunu kim soruyor?
Blau

Soru soruyor. “Kodum şu anda bana iki duvar kenarının kesiştiğini ancak ilk önce hangi kenara çarpacağını ve bu nedenle hangi kenarı sekmeyeceğini söylüyor .”
Nathan Reed

ilk? sorun, ilk olan değil, aynı anda iki kenara çarpışıyor, ... madde hangi kenara sıçrayacaksa, sizin için iyi bir yöntem seçtiniz, ben bir yöntem seçtim. bana iyi, her ikisi de geçerlidir
Blau

1
Nesnelerin birbirlerinin arasından geçip geçmelerine izin vermek için bir tasarım kararı vermek istiyorsanız, sanki köşelerde yuvarlanmış veya eğimli gibi, bu sizin kararınızdır ve oyununuz için doğru şey olabilir. Ancak sorunun tasarım kararı hakkında soru sorduğunu sanmıyorum; eksenel hizalanmış dikdörtgenlerin birbirinden nasıl sekerek çıkacağını matematiksel olarak soruyor . Bu bir yorum meselesi değil; Bu matematik probleminin hangi kenarı zıplayacağı konusunda net ve doğru bir cevabı var.
Nathan Reed

0

Burada benzer bir soruyu cevapladım

Önceki pozisyonları kontrol etmeyi düşünebilirsiniz.

Örneğin: eğer sol tarafınız daha önce sağ tarafın sağındaysa ve çarpışıyorsanız, o zaman bir sağ çarpışma oldu.

Bunu yaparsanız, sadece y ekseni çarpışmalarını çözün, bir şeyle çarpışıp çarpışmadığınızı kontrol edin, sonra x ekseni çarpışmalarını çözün.

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.