Minkowski toplamını kullanma
Bu sorunu çözmek için iyi bir yol, bir hareket hattı arasında kesişim dikkate etmektir ( V ) başlangıç konumuna (çevrilmiş V ' ) ve Minkowsky toplamı ve A başlangıç konumuna (180 derece döndürülmüş bir' ) ve bunun engeller (sadece B Bu durumda): A' ⊕ B .
Aşağıdaki resimde keyfi bir koordinat sisteminin kökenine bir şaplak takıyorum. Bu, A'nın 180 derece döndürülmesi ile anlaşılmayı kolaylaştırır, A 'ile sonuçlanır ve v , kökenine çevrilen v' e eşittir ' .
Minkowski toplamı yeşil dikdörtgendir ve hareketli A ile sabit B'nin kesişim noktaları, çizgi AABB kesişimini yaparak bulunabilir . Bu noktalar mavi dairelerle işaretlenmiştir.
Aşağıdaki resimde farklı bir başlangıç noktası kullanılmış ve aynı kesişim noktaları bulunmuştur.
Çok hareketli AABB'ler
Bu işi belirli bir süre boyunca doğrusal bir şekilde hareket eden iki AABB için yapmak için B'nin hız vektörünü A'nın hız vektöründen çıkarır ve bunu AABB kesişimi için çizgi parçası olarak kullanırsınız.
Sahte kod
def normalize(aabb):
return {x1: min(aabb.x1, aabb.x2), x2: max(aabb.x1, aabb.x2),
y1: min(aabb.y1, aabb.y2), y2: max(aabb.y1, aabb.y2),
def rotate_about_origin(aabb):
return normalize({x1: -aabb.x1, x2: -aabb.x2
y1: -aabb.y1, y2: -aabb.y2})
# given normalized aabb's
def minkowski_sum(aabb1, aabb2):
return {x1: aabb1.x1+aabb2.x1, x2: aabb1.x2+aabb2.x2,
y1: aabb1.y1+aabb2.y1, y2: aabb1.y2+aabb2.y2}
def get_line_segment_from_origin(v):
return {x1: 0, y1: 0, x2: v.x, y2: v.y}
def moving_objects_with_aabb_intersection(object1, object2):
A = object1.get_aabb()
B = object2.get_aabb()
# get A'⊕B
rotated_A = rotate_about_origin(A)
sum_aabb = minkowski_sum(rotated_A, B)
# get v'
total_relative_velocity = vector_subtract(object1.get_relative_velocity(), object2.get_relative_velocity())
line_segment = get_line_segment_from_origin(total_relative_velocity)
# call your favorite line clipping algorithm
return line_aabb_intersection(line_segment, sum_aabb)
Çarpışma yanıtı
Oyuna bağlı olarak, daha ince taneli çarpışma algılaması (belki AABB'lerde ağlar içerebilir) veya bir sonraki aşamaya geçersiniz: çarpışma yanıtı.
Bir çarpışma olduğunda, AABB kesişme algoritması, A'nın B içindeki hareketini bitip bitmediğine veya içinden geçip geçmediğine bağlı olarak 1 veya 2 kesişme noktası döndürür. (Bu, A'nın B'yi kendi kenarları boyunca veya ilgili köşelerinden biri boyunca sıyırdığı dejenere vakaları iskonto ediyor.)
Her iki durumda da doğru parçasının boyunca ilk kesişim noktası çarpışma noktası, dünyanın doğru konuma koordinat sistemi için bu geri (orijinal boyunca ikinci resimde ilk açık mavi daire çevirmek istiyorum v , diyoruz p ) ve daha sonra (karar örneğin, yansıtarak elastik çarpışmalar v normal çarpışma boyunca p gerçek konumu hangi) A çerçevenin sonunda (olacaktır + 1 'de ).
2'den fazla çarpıştırıcı varsa, v'nin ikinci, yansıyan kısmı için çarpışma algılama yapmak istediğiniz için bu biraz daha karmaşık hale gelecektir .