DÜZENLEME / GÜNCELLEME: Şu anda en büyük sorum 3. adımın "t = ..." denkleminin iyi bir fikir mi yoksa bunu yapmanın daha iyi bir yolu olup olmadığı. Diğer sorunların birçoğu kısmen veya tamamen ele alınmıştır, ancak bu konuda gerçekten herhangi bir yorum veya yanıt dokunmamıştır. Yine, bir analitik çözüm muhtemelen gereklidir, hızlar ve mesafeler çok büyüktür ve nesneler çok küçüktür, düşünebileceğim herhangi bir yinelemeli / özyinelemeli çözüm (yorumlarda aşağıda birkaç tavsiye edilir) bu tür durumları iyi idare edecek özel bir yinelemeli / özyinelemeli çözüm o zaman kesinlikle buna açıkım). Şimdiye kadar yardımlarınız için çok teşekkür ederim, hepiniz harikasınız ve düşüncelerinizi ve yardımlarınızı gerçekten takdir ediyorum!
Küçük, yüksek hızlı nesneler arasındaki çarpışmaları tespit etmeye çalışıyorum. Bu, tünellemenin nispeten düşük hızlarda bile çok kolay gerçekleşebileceği bir durumdur.
Işın dökümü çalışmaz, çünkü bu, bir nesne ile sabit bir duvar arasında değil, iki yüksek hızlı nesne arasındaki bir çarpışmayı tespit eder. (Işın döküm yanlış anlamadıysanız?) Performans ÇOK ÇOK bir husustur; mümkünse, büyük bir performans isabetinden kaçınmak istiyorum. Zaten işlevsel ve çok etkili bir dörtlü ( http://en.wikipedia.org/wiki/Quadtree ) uyguladım, bu yüzden aşağıda açıklandığı gibi değiştirip kullanacağım.
Düzenleme: Zaman aralığını azaltmak işe yaramaz. Bu çözüm için hızlar çok yüksek, bu da tünel çarpışmalarının büyük çoğunluğunu kaçırırken performans vuruşlarının çok büyük olacağı anlamına geliyor . (Örneğin, zaman aralığı başına milyonlarca birim olarak ölçülen bir hızda yaklaşık 1 birim büyüklüğünde bir nesnem olabilir ...)
ÖNERİLEN ÇÖZÜM:
Aşama 1:
Her nesnenin hareketi etrafında bir kutu oluşturun, sonra olası çarpışmaların ilk listesini oluşturmak için bu kutuları dörtlü ağaçlara besleyin. Aşağıdaki resme bakın (bu resim, bir konumdan diğerine hareket eden bir daire nesnesini ve dörtgene beslenecek bir dikdörtgen oluşturan hareketi gösterir):
2. Adım: (bu adımı atlamak isteyebilir misiniz?)
Dörtlü tarafından üretilen olası çarpışmalar listesini gözden geçirin. Dikdörtgenlerin olası her çarpışmada kesişip kesişmediğine bakın. Öyleyse, 3. adıma geçin.
EDIT: Aşağıda, Sean Middleditch süpürülmüş hacimler / kapsüllerin kesişimi kullanılmasını önerdi (nesneler daireler ise). Bu üç seçenek bırakır: 1) 2. adımı tamamen atlayın. 2) 2. adımı kendi yöntemimle yapın. 3) Sean'ın yolunu yap. Sean'ın yolu kutu fikrimden daha hesaplı olarak pahalı olacak, ancak benim yolumdan daha yanlış pozitifler ayıklayacak ve onların son adıma geçmelerini engelleyecek.
Herkes bu 3 seçenekten hangisinin en iyisi olduğu konusunda deneyimlerden konuşabilir mi? (Bu fizik motorunu birkaç farklı şey için kullanmayı planlıyorum, bu yüzden hangi çözümü kolayca ölçebileceğim tek bir test vakası değil, en geniş çeşitlilikte en hızlı çalışan "genellikle en iyi" çözümü arıyorum en hızlı).
Aşama 3:
Diskriminant (yani karekök altındaki parça) negatif veya 0 ise, çarpışma yoksa, aşağıdaki t = denklemini kullanın, eğer pozitifse t değerini çarpışma zamanı olarak kullanın (bundan sonra pozisyonları buna göre ayarlamak kolaydır. Çarpışmadan sonra her iki nesne de var olmaya devam ederse). Denklem:
t = (-1/2 metrekare ((2 a w-2 a x + 2 b y-2 b z-2 c w + 2 c x-2 d y + 2 dz) ^ 2-4 (w ^ 2- 2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2) (a ^ 2-2 a c + b ^ 2-2 b d + c ^ 2 + d ^ 2-r ^ 2-2 r ss ^ 2)) - a w + a xb y + b z + c wc x + d yd z) / (w ^ 2-2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2 ) .
(1 ve 2, 1 ve 2 nesnelerini belirtmek için kullanılır):
t, 0 ile -1 arasında negatif bir zaman değeridir; burada 0, geçerli karedir ve -1, bir önceki karedir;
a = x konum 1;
b = y konum 1;
c = x konum 2;
d = y konum 2;
w = x hız 1;
x = x hız 2;
y = y hız 1;
z = y hız 2;
r = yarıçap 1;
s = yarıçap 2;
Türev: (^ 2, kare anlamına gelir)
Nesnelerin hareketleri için parametrik denklemler (örneğin, newxpos1 = a + t w) alın ve bunları uzaklık formülüne takın (her iki tarafın karesi): kare formülü karesi = (a + t w - (c + t x)) ^ 2 + (b + t y - (d + t * z)) ^ 2. Unutmayın, t negatif olacaktır. İki dairesel nesnenin çarpışma zamanını bulmak için sol tarafı (r + s) ^ 2'ye eşit olarak ayarladık. İkinci dereceden denklemi (ve çok fazla sıkıcı cebiri) kullanarak t için çözerek yukarıdaki "t = ..." denklemini elde ederiz.
Sorularım:
1) Bunu yapmanın iyi bir yolu var mı? Hiç işe yarayacak mı? Öngörülemeyen herhangi bir sorunla karşılaşacak mıyım? (Bir seferde 2'den fazla nesne çarpıştığında sorun yaşayacağımı biliyorum, ama gerçekten itiraz ettiğim tek durum düşük göreceli hızlara sahip oldukları zaman (göreceli hızlar yüksekse) umurumda değil. daha sonra algoritmanın verdiği "aptal" çözüm "yeterince iyi" olacaktır ve bir insanın hatayı görmesi imkansız olacaktır) ve aynı zaman adımında düşük göreceli hızlarla ikiden fazla çarpışırsa, çoğu çözüm zaten yeterince yakın ol, çünkü bir sürü esnek olmayan çarpışmayı planlamıyorum)
2) Performansım çok acı çekecek mi? Bunun olacağını düşünmüyorum, ama eğer yapacaksa, bunu yapmanın daha iyi bir yolu var mı?
3) Adım 2'yi atlamalı ve adım 1 ila 3'ten doğrudan mı gideyim? Açıkçası 2. adım hayati değildir, ancak performansa yardımcı olabilir (VEYA tasarruf ettiğinden daha fazla CPU zamanına mal olabilir).
Diğer tüm yorum, öneri veya eleştirilere açığız. Yardımın için teşekkürler!