İki çarpışan cismin nüfuzunu nasıl çözebilirim?


9

Basit 3D oyun fizik motoru uyguladım. Zaten iyi bir çarpışma tespiti var, şimdi çarpışma tepki kısmını anlamaya çalışıyorum. Çarpışma sonrası hızları hesaplamak için dürtü tabanlı yöntem kullanıyorum. Bu oldukça iyi çalışıyor, ancak vücutların iç içe geçmesini tamamen engellemiyor. Yani penetrasyonu çözmek için ek kod parçası var. Şu anda, vücutları normalde temas derinliği boyunca penetrasyon derinliğinin yarısı kadar hareket ettiriyorum - ilk vücut normal temas yönünde, ikinci vücut ters yönde.

Bu çoğu zaman iyidir, ancak bazı istenmeyen etkiler vardır. Örneğin, dar bir koridor ve içinde hareket eden bir nesne düşünün. Nesne koridorun duvarlarından birine çarparsa, penetrasyon çözünürlüğü onu karşı duvara, daha sonra bir sonraki çerçevede ilk duvara geri döndürür ve bu şekilde devam eder. Etki, nesnenin duvarlar arasında gerçekten hızlı olmayan bir şekilde titremesidir.

Benim sorum, penetrasyonu çözmenin daha iyi bir yolu olup olmadığı? Belki de bedenleri hareket ettirmeyin, hızlarını bir şekilde ayarlayın (dürtü hesaplamasına ek olarak), böylece birbirlerine doğru hareket etmeyi bırakırlar ve penetrasyon sonraki birkaç karede kendiliğinden çözülür. Sadece burada tahmin ediyorum. Herhangi bir fikir?

Yanıtlar:


3

Bir çarpışma tespit ettiğinizde, cisimlerin ilk olarak hangi saatte / noktada çarpışmaya başladığını belirleyin ve çarpışmayı bu noktada tedavi edin. Bu noktada çözmek için hala hafif bir penetrasyonunuz olabilir, ancak çok daha küçük olacaktır ve [tipik olarak] yaşadığınız salınım sorunlarını vermeyecektir.

Diyelim ki 100ms simülasyon adımınız var ve bazı çerçevelerde, çerçeveye yarım (50ms) çarpışan iki topunuz var. İlk olarak, çerçevenin herhangi bir noktasında çarpıştığını tespit edeceksiniz (ki zaten etkili bir şekilde yaptığınıza inanıyorum). Çerçevede hangi noktada çarpıştıklarını belirleyecekler. Şimdi, çarpışmadığı çerçevenin ilk 50 ms'si dahil olmak üzere çarpışmayı ele alın. Artık topların yeni hızlarına sahip olacaksınız ve artık nüfuz etmediklerinden emin olmak için şimdi adımlar atabilirsiniz (bunlar "daha yeni" olduğundan çok küçük olmalıdır.) Son olarak, gelecek 50'leri simüle edeceksiniz. çerçeve. Bu süre zarfında, bu toplardan biri veya her ikisi ile başka bir çarpışma olabileceğini unutmayın.


1
Bu yüzden, temel olarak sürekli çarpışma tespitini uygulamanızı ve daha sonra da zaten yaptığım şekilde bıraktığınız penetrasyonları ele almayı öneriyorsunuz, çünkü muhtemelen çok küçük olacaklar. Sanırım bu işe yarayabilir. Şimdi sadece çarpışma algılamamı nasıl sürekli kılacağımı bulmak zorundayım :)
adam

Ne demek istediğinden emin değilim sürekli. Kesinlikle konuşmak gerekirse, fizik simülasyonunda sürekli bir şey yoktur, çünkü her şey her zaman bazı boyutlardaki ayrık adımlara ayrılır. Aslında önerdiğim daha küçük adımlar atmak çok daha küçük (ve düzeltilmesi daha kolay) hatalar verecektir. Bunu düşünmenin bir başka yolu, adım büyüklüğü ve hatalar (penetrasyon gibi) arasında doğrudan bir ilişkinin olmasıdır. Bu nedenle, böyle bir hatayı tespit ettiğinizde, hata önemsiz bir şekilde düzeltilinceye kadar daha küçük adımlara bölün.
notlesh

Sürekli çarpışma algılama, iki statik nesne arasındaki kesişmeyi kontrol etmek yerine (3 boyutlu bir sorun), iki hareketli nesnenin (temel olarak bir 4d problemi) temasını kontrol ettiğiniz anlamına gelir. Genellikle sabit hızları dikkate almak yeterlidir, çünkü yörüngeleri parçalı doğrusal eğrilerle yaklaşık olarak tahmin edebilirsiniz. Avantajı, penetrasyon mesafesinin daima sıfır (veya şamandıra yuvarlama hataları nedeniyle yakın) olmasıdır. Ben bunun hakkında konuşuyordun, ama belki cevabını yanlış yorumladım?
adam

@adam Evet, bundan bahsediyorum.
notlesh

2

Burada daha önce birçok kez yayınlanmış olan bu makaleye göz atın, sadece Soru-Cevap etiketli çarpışma tespiti için arama yapın - stephelton'un bahsettiği "sürekli" çarpışma çözünürlüğünü nasıl yapacağınızı gösterir:

http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php?page=3

Temel olarak, iki sınırlayıcı kutunuz kesişmeye başladığında kesin zaman noktası için bazı temel kinematik denklemlerini çözersiniz. Çarpışmalarınızı tam o anda çözersiniz ve daha sonra çerçevenizde kalan süreye devam edersiniz. Çarpışma anından sonra olanları yeniden simüle etmeniz gerekebilir, çünkü nesnelerinizin hızı / ivmeleri değişmiş olacaktır. Ama başlangıç ​​noktanız var, neyse ... şerefe!


Teşekkürler, makaleyi kontrol ettim. Şey, nesnelerimin farklı temsilini kullanıyorum. Dışbükey polihedra kullanıyorum ve ayırma ekseni teoremini kullanarak çarpışmayı test ediyorum. Bu, sabit doğrusal hızlarla (nasıl yapıldığını biliyorum) hareket eden gövdeleri işlemek için genişletilebilir, ancak açısal hızların nasıl ele alınacağına dair bir fikir yoktur. Ama bu şekilde gitmeye karar verirsem ayrı bir soru soracağım.
adam
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.