Bu soru, burada bulabileceğiniz çarpışma tespiti ve çözümü ile ilgili bir önceki sorumdan bir "takip" sorusudur .
Önceki soruyu okumak istemiyorsanız, işte fizik motorumun nasıl çalıştığı hakkında kısa bir açıklama:
Her fiziksel varlık SSSPBody adlı bir sınıfta depolanır.
Sadece AABB'ler desteklenir.
Her SSSPBody, her gövdeyi güncelleyen ve yerçekimini idare eden SSSPWorld adlı bir sınıfta saklanır.
Her kare, SSSPWorld her gövdeyi günceller.
Güncellenen her vücut, uzamsal bir karma değerindeki yakındaki gövdeleri arar, bunlarla çarpışma algılaması gerekip gerekmediğini kontrol eder. Eğer evet ise, bir "çarpışma" olayı başlatırlar ve onlarla çarpışmaları çözmeleri gerekip gerekmediğini kontrol ederler. Eğer evet ise, penetrasyon vektörünü ve yön örtüşmesini hesaplarlar, daha sonra penetrasyonu çözmek için pozisyonlarını değiştirirler.
Bir vücut bir başkasıyla çarpıştığında, sadece vücut hızını kendi ayarlayarak hızını diğerine aktarır.
Bir gövde, son kareden pozisyon değişmediği zaman 0'a ayarlanır. Ayrıca hareketli bir gövdeyle (asansör veya hareketli platformlar gibi) çarpışırsa, vücudun son konumundan hareket edip etmediğini görmek için asansörün hareket farkını hesaplar.
Ayrıca, bir vücut bütün AABB köşeleri çerçevedeki bir şeyle üst üste geldiğinde "ezilmiş" bir olayı başlatır.
Bu , oyunumun TAM kaynak kodu. Üç projeye ayrılmıştır. SFMLStart, varlıkların yönetimi, çizilmesi ve güncellenmesi için basit bir kütüphanedir. SFMLStartPhysics, SSSPBody ve SSSPWorld sınıflarının olduğu en önemli olanıdır. PlatformerPhysicsTest, tüm oyun mantığını içeren oyun projesidir.
Ve bu , SSSPBody sınıfındaki "güncelleme" metodudur, yorumlu ve basitleştirilmiştir. Bütün bunlara SFMLStartSimplePhysics projesine bakmak istemiyorsanız bakın. (Yapsanız bile, yorum yapıldığından beri buna bir göz atmalısınız.)
.Gif iki problem gösterir.
- Vücutlar farklı bir sıraya yerleştirilirse, farklı sonuçlar olur. Soldaki kasalar, sağdaki kasalarla aynıdır, sadece ters sırada (editörde) yerleştirilir.
- Her iki kasa da ekranın üst kısmına doğru itilmelidir. Soldaki durumda, hiçbir kasa itilmiyor. Sağ tarafta, bunlardan sadece biri. Her iki durum da istenmeyen.
İlk sorun: güncelleme sırası
Bu anlaşılması oldukça basittir. Soldaki durumda, en üstteki kasa diğerinden önce güncellenir. Alttaki kasa diğerine "aktarır" olsa bile, bir sonraki karenin hareket etmesini beklemesi gerekir. Hareket etmediğinden, taban kasasının hızı 0 olarak ayarlanmıştır.
Bunu nasıl düzelteceğimi bilemiyorum. Çözümün güncelleme listesini "sıralamaya" bağlı olmamasını tercih ederim, çünkü tüm fizik motoru tasarımında yanlış bir şey yaptığımı hissediyorum.
Büyük fizik motorları (Box2D, Bullet, Chipmunk) güncelleme sırasını nasıl ele alıyor?
İkinci sorun: tavana doğru yalnızca bir kasa itiliyor
Bunun neden olduğunu henüz anlamadım. "Yay" öğesinin yaptığı, vücudun hızını -4000'e ayarlamak ve yayın üzerine tekrar yerleştirmektir. Yeniden konumlandırma kodunu devre dışı bıraksam bile, sorun devam ediyor.
Benim fikrim, alt sandık üst sandıkla çarpıştığında, hızının 0 olarak ayarlanmış olmasıdır.
İlk sorundan vazgeçmiş birine benzeme şansına rağmen, yukarıdaki tüm proje kaynak kodunu yayınladım. Bunu kanıtlayacak bir şeyim yok, ama inan bana, bunu düzeltmek için çok çalıştım ama bir çözüm bulamadım ve fizik ve çarpışmalarla ilgili daha önce hiçbir tecrübem yok. Bu iki sorunu bir haftadan fazla bir süredir çözmeye çalışıyorum ve şimdi çaresizim.
Oyundan pek çok özellik çıkarmadan tek başına bir çözüm bulabileceğimi sanmıyorum (örneğin hız transferi ve yaylar).
Bu soruyu okumak için harcadığınız zaman için çok teşekkürler ve bir çözüm ya da bir öneriyle gelmeye çalışsanız bile, daha çok teşekkür ederiz.