Hizalanmamış çarpışmayı önleme (direksiyon) kullanırken çarpışan nesneleri taşıma


9

Nadir bir durum olduğunu düşündüğüm şey için hizalanmamış çarpışmadan kaçınma konusunda sorun yaşıyorum. İki nesneyi birbirine doğru hareket edecek şekilde ayarladım, ancak hafif bir ofsetle, nesnelerden biri biraz yukarı doğru hareket ediyor ve nesnelerden biri biraz aşağı doğru hareket ediyor.

Hizalanmamış çarpışmadan kaçınma yönlendirme algoritmamda, nesnenin ileri çizgisinde ve diğer nesnenin ileri çizgisinde bu iki çizginin en yakın olduğu noktaları buluyorum. Bu en yakın noktalar çarpışmadan kaçınma mesafesindeyse ve aralarındaki mesafe, iki nesnenin sınırlayıcı kürelerinin iki yarıçapından daha küçükse, nesneler uygun yönde çekilmelidir.

Sorun şu ki benim durumumda, çizgilerdeki en yakın noktaların gerçek çarpışma noktasından çok uzakta olduğu hesaplanıyor. Bunun nedeni, her nesne için iki ileri çizginin, nesneler geçerken birbirinden uzaklaşmalarıdır. Sorun şu ki, bu nedenle, hiçbir direksiyon gerçekleşmez ve iki nesne kısmen çarpışır.

Nesne ileri çizgilerinin ekran görüntüsü.

Çarpışma noktasını doğru bir şekilde nasıl hesaplayabileceğim konusunda herhangi bir öneriniz var mı? Belki bir şekilde iki nesnenin boyutunu dikkate alarak?


Ekran görüntüsünde yeşil, kırmızı ve mavi çizgilerin sadece 3D dünyasının eksenleri olduğunu unutmayın.
James Bedford

Yanıtlar:


6

Bu şimdiye kadar karşılaştığım en iyi top çarpışma tespit makalesi.

Bilardo Salonu Dersleri: Daireler veya Küreler Arasında Hızlı, Doğru Çarpışma Tespiti


Küre-küre çarpışma testinin nasıl yapılacağını biliyorum. Benim sorunum gelecekte bu çarpışmanın gerçekleşeceği konumu bulmaya çalışmak. Teşekkürler.
James Bedford

@James bu makalede sorunlarınızı çözecek. Sayfa 2'ye bakın ve "gelecekte" çarpışma noktasını belirlemek için kürelerinizdeki "hız" için keyfi olarak yüksek bir sayı kullanabilirsiniz.
Tetrad

Tamam - kontrol etmediğim için üzgünüm, oldukça iyi görünüyor! Okuduğumda sana geri dönmem gerekecek. Teşekkürler :)
James Bedford

1
"Banka Çekimi: İki hareketli daire arasındaki çarpışma" bölümündeki 2. sayfada , ilk dairenin hızı yerine algoritmada iki dairenin hızı arasındaki farkı kullanmanız gerektiği anlamına gelebilir miyim? (İkinci dairenin hızı algoritmanın durağan versiyonunda kullanılmaz.) Bu bit benim için çok açık değildi. Teşekkürler.
James Bedford

0

En yakın noktayı bulmak istemiyorsun.

Mesafenin her iki kürenin birleşik yarıçapına eşit olduğu çizgilerdeki noktayı bulmak istersiniz.


Ah tamam! Bunu matematiksel olarak nasıl anlayabileceğimi biliyor musunuz ..?
James Bedford

0

Sorunuzu doğru bir şekilde anlıyorsam, AttackingHobo'nun önerdiği gibi bir Sphere vs Sphere kavşak testini kullanabilirsiniz.

Böyle bir test yapmanın matematiği aşağıdaki gibidir (eğer yanılıyorsam beni düzeltin, bir süredir oldu). Ayrıca, bu, kürelerinizin her birinde bir merkez ve bir yarıçap değişkeni olduğu düşünülmektedir.

Kontrol formülü şu şekildedir:

distanceOfSpheres <= sumOfRadii^2

Kürenin vs küre kesişimine sahipsiniz. Bu oldukça basit, kodda neye benzediğini görelim!

bool sphereIntersectTest(BoundingSphere* s1, BoundingSphere* s2)
{
   Vector3 distance;

   // Get the distance between each sphere, center is a Vector3 type
   distance = (s1->center - s2-> center);

   // Determine the sum of both radii
   float radii = (s1->radius + s2->radius);

   // Determine if we have an intersection
   if (distance.length <= (radii * radii))
      return true;
   else
      return false;
}

Yine, bu aradığınız doğru cevap olduğunu düşünüyorum. Eğer bunun yanlış olduğunu bilen biri varsa lütfen beni düzeltin, çünkü bu matematiği yaptığımdan bu yana bir süre geçti.


Küre-küre çarpışma testinin nasıl yapılacağını biliyorum. Benim sorunum gelecekte bu çarpışmanın gerçekleşeceği konumu bulmaya çalışmak. Teşekkürler.
James Bedford

0

Tamam, umarım bu mantıklıdır ... Topların vektörlerini alın ve çarpışma noktalarını hesaplayın, buna p1 deyin. 2 vektör arasındaki açıyı bulun, buna a1 deyin. A1 / 2'de bir çizgi çizin, bu iki vektör arasındaki derece cinsinden tam ortada olacaktır. Bu satırda sin (a1 / 2) = (radius1 + radius2) / 2'nin bulunduğu yere ihtiyacınız var. Bu resim kafamda sağda görülüyorsa, çarpışma burada gerçekleşiyor. Bu yanlışsa özür dilerim ... çok geç.

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.