Aşağıdaki yaklaşımı kullanıyorum (Tonge kütle bölme algoritmasına benzer : http://www.richardtonge.com/ ):
- sahnenizdeki / bağlamınızdaki tüm çarpışan çiftleri algılar. (A, B) böyle bir çift olsun. Bir hayalet / kütle bölme fikri uygulayın: A, M gövdeleriyle temas halindeyse ve B, diğer N gövdesi ile temas halindeyse , A'nın kütlesini geçici
m_A/M
olarak B'ye vem_B/N
- her bir çift (A, B) için reaksiyon / restitüsyon kuvveti katkılarını hesaplar ve bu katkıları A ve B'nin kendi akümülatörlerinde depolar
- impulslardan restitüsyon hızlarını hesaplayın (belirttiğiniz gibi) ve aynı şekilde saklayın ( her bir (A, B) çifti için kendi akümülatörlerinde deltaV hız kalıntıları olarak)
- ceza infazlarının hesaplanması (yine deplasmanları biriktirin, anında uygulamayın!)
- daha önce çarpışma çiftlerinde (
m_A = m_A * M
ve m_B = m_B * N
) parti olarak belirlenmiş tüm organların kütlelerini sıfırlayın
Bu yaklaşım, Jacobi yinelemeli algoritmanın doğrusal eşzamanlı denklem sistemleriyle nasıl çalıştığına benzer. Ve birleşmesi garanti edilmez, ancak simülatörümde işi oldukça sorunsuz yapar .. 3D'de (evet, ekstra bir boyut iki kat zorluk ekler!).
Uyarı : pozisyonları ve hızları ancak çarpışma algılama / elleçleme aşaması bittikten sonra düzeltin! Bu şekilde, çarpışan aktörlerinizi aynı anda güncellersiniz. Ayrıca, konumlar ve hızlar için bir sonraki entegrasyonunuzda restitüsyon güçleri de dikkate alınmalıdır.
EDIT: Sanırım zaten suistimal edilmiş Verlet entegrasyon yöntemini kullanıyorsunuz (bu gamedev meraklıları içinde bir ev ismi haline geldi). Bu çarpışma yönetimi ve entegrasyon hayaletinde, buraya bir göz atmak isteyebilirsiniz .
GÜNCELLEME: Çarpışmaya nasıl yaklaşılacağı hakkında bazı bilgiler (ve bu konuda kendi kendine çarpışma) şu makalelerde bulunabilir:
Önerdiğim yaklaşım uzun zamandır orijinal bir katkı değil, birçok oyun bunu makul sonuçlarla kullanıyor ve Jakobsen tarafından Hitman oyun motorunda en iyi şekilde kullanılıyordu.
Biraz pratik bir deneyimden, ceza kuvvetleri (girişlerini penetrasyon mesafesinden alan doğrusal veya üstel yaylara benzer şekilde) çarpışan cisimlerden gelen diğer kuvvetler onlardan daha büyük olmayı başardığında nüfuzları düzgün bir şekilde çözmezler. Bu yüzden üç (neredeyse gereksiz) yaklaşımı birleştirmeyi seçtim: Newton reaksiyonu kuvvetleri (duvarı itiyorsunuz, duvar geri itiyor), dürtü kaynaklı hızlar (bilardo topları çarpışıyor) ve doğal olmayan bir "bedenleri geometrik olarak birbirinden uzaklaştırıyor " çözüm. Birlikte her şeyi sağlıyorlar: çoğu şeyden kurtulunçirkin iç içe geçme eserleri, çarpışan bedenler uzun vadede birbirleriyle etkileşime girme eğilimindedir (restitüsyon hızları ve kuvvetleri nedeniyle - en azından bir çarpışma senaryosunda bedenleri sürükleme eğilimi olan kuvvetler iptal edilir ve bedenler birbirinden uzaklaşır) . Son olarak, bu basit ama ortak kavramları daha iyi anlamak için, bu slaytları analiz etmenizi öneririm .
Verlet entegrasyon adımlarını açıklayan "istismar edilmiş yöntem" epithet'im, bunun entegrasyon yöntemlerinin Kutsal Kâsesi olduğuna dair popüler bir kültür inancını hedefliyor. Symplectic Euler (bazı yarı örtülü Euler olarak da bilinir) kuzeninden çok az daha iyidir. Çok daha karmaşık entegrasyon yöntemleri vardır (ve hepsinde örtük isim vardır). Güçlü oyun motorları bunları kullanır, ancak bağımsız geliştiricilerin Verlet'i belirli bir senaryoya ayarlandığında gerçekten harikalar yaptığı için deneyecek zamanları yoktur. Ayrıca, biraz hile yapmadan katı kısıtlamalarla başa çıkabilecek hiçbir entegrasyon yöntemi yoktur (bağlantıyı bulamıyorum, ancak bahsettiğim kağıda "X.Provot -" Bir Kitle'deki Deformasyon Kısıtlamaları denmelidir. Kumaş Davranışını Tanımlamak için Yayılma Modeli "