Wykrywanie kolizji między sferami przyspieszającymi

Piszę silnik fizyczny / symulator, który zawiera lot kosmiczny 3D, grawitację planetarną / gwiezdną, siłę ciągu i efekty relatywistyczne. Jak dotąd idzie bardzo dobrze, jednak potrzebuję pomocy z matematyką algorytmu wykrywania kolizji.

Iteracyjna symulacja ruchu, której używam, wygląda następująco:

(Uwaga: Wektory 3D to CAPS.)

For each obj

    obj.ACC = Sum(all acceleration influences)

    obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2     (*EQ.2*)

    obj.VEL = obj.VEL + (obj.ACC * dT)

Next

Gdzie:

obj.ACC is the acceleration vector of the object
obj.POS is the position or location vector of the object
obj.VEL is the velocity vector of the object

obj.Radius is the radius (scalar) of the object

dT is the time delta or increment

To, co zasadniczo muszę zrobić, to znaleźć skuteczną formułę, która pochodzi z (EQ.2) powyżej dla dwóch obiektów (obj1, obj2) i powiedz, czy kiedykolwiek kolidują, a jeśli tak, to o której godzinie. Potrzebuję dokładnego czasu, aby móc określić, czy jest to w tym konkretnym czasie (ponieważ akelleratony będą różne w różnych odstępach czasu), a także, że mogę zlokalizować dokładną pozycję (co wiem, jak to zrobić, biorąc pod uwagę czas)

Dla tego silnika modeluję wszystkie obiekty jako kule, wszystkie te formuły / algortithim muszą zrobić, aby dowiedzieć się, w jakich punktach:

(obj1.POS - obj2.POS).Distance = (obj1.Radius + obj2.Radius)

gdzie. Odległość jest dodatnią wartością skalarną. (Można również obrócić obie strony, jeśli jest to łatwiejsze, aby uniknąć funkcji pierwiastka kwadratowego niejawnej w obliczeniu .Distance).

(tak, zdaję sobie sprawę z wielu, wielu innych pytań związanych z wykrywaniem kolizji, jednak ich rozwiązania wydają się być bardzo specyficzne dla ich silnika i założeń, a żadne z nich nie pasuje do moich warunków: 3D, kule i przyspieszenie zastosowane w przyrostach symulacji Daj mi znać, jeśli się mylę.)

Niektóre wyjaśnienia:

1) Nie wystarczy sprawdzić * Przecięcie * dwóch sfer przed przyrostem czasu i po nim. W wielu przypadkach ich prędkości i zmiany położenia znacznie przekraczają ich promienie.

2) RE: wydajność, nie potrzebuję pomocy (w tym momencie i tak) w odniesieniu do określenia prawdopodobnych kandydatów do kolizji, myślę, że mam to objęte.

Kolejne wyjaśnienie, które wydaje się bardzo często pojawiać:

3) Moje równanie (EQ.2) ruchu przyrostowego jest równaniem kwadratowym, które stosuje obie prędkościi Przyśpieszenie:

obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2

silniki fizyczne, które widziałem (i na pewno każdy silnik gry, o którym kiedykolwiek słyszałem)liniowy obowiązujące równania ruchu przyrostowegotylko Prędkość:

obj.POS = obj.POS + (obj.VEL * dT)

Dlatego nie mogę używać powszechnie publikowanych rozwiązań do wykrywania kolizji w StackOverflow, Wikipedii i całej sieci, takich jak znajdowanie skrzyżowania / najbliższego podejścia dwóch segmentów linii. Moja symulacja dotyczy zmiennych przyspieszeń, które są fundamentalne dla wyników, więc potrzebuję przecięcia / najbliższego podejścia dwóchparaboliczny segmenty.

questionAnswers(4)

yourAnswerToTheQuestion