2015-01-24 3 views
0

Я собираюсь разработать игру с карманом. У меня проблема с столкновением двух частей. Как найти точку столкновения двух частей. А затем, как найти угол и расстояние между кусками после столкновения. Я нашел решение точки столкновения на circle-circle collision. здесь решение описывается тригонометрией, но я хочу решение с векторной математикой. С помощью которой проблема расстояния, пройденного после столкновения, также будет легко решена.Столкновение круглых объектов

+2

Прочитайте ответ до конца. В конце концов тригонометрия отменяется. –

+0

Это прекрасно, но для дальнего путешествия после столкновения нам нужна векторная физика. –

+1

Что вы ищете? У вас есть критерий столкновения. У вас есть точка столкновения, которая находится где-то на линии между двумя центральными точками ваших объектов. У вас есть нормаль на касательной плоскости в точке столкновения, которая представляет собой только разностный вектор между точкой столкновения и центральной точкой. Это все векторные математики, не связанные с тригонометрическими функциями. –

ответ

1

Вам не нужно искать точку столкновения для самого вычисления столкновения. Для того, чтобы обнаружить событие столкновения, вам нужно всего лишь сравнить расстояние центров идут сумма радиусов

sqrt(sqr(x2-x1)+sqr(y2-y1))<=r1+r2 

или

dx*dx+dy*dy <= (r1+r2)*(r1+r2) 

где (x1,y1) и (x2,y2) являются позиции дисков 1 (с массой m1 , радиус r1 и скорости (vx1,vy1)) и 2. Различия всегда 2 минус 1, dx=x2-x1 т.д.


Вы почти никогда не поймете, что столкновение происходит в момент времени дискретизации времени. С приведенной выше формулой круги уже перекрываются. В зависимости от временного шага и общих скоростей это может быть незначительным или может привести к серьезной перестрелке. Следующие простые вычисления предполагают замедленное движение, т. Е. Очень небольшое перекрытие во время последнего шага времени.


Единственное, что происходит при полностью упругом столкновении невращающихся дисков, - это изменение скорости. Это изменение должно произойти только один раз, когда дальнейшее движение приведет к дальнейшему сокращению расстояния, то есть, если

dx*dvx+dy*dvy < 0 

где dvx=vx2-vx1 и т.д.

Используя эти идеи, вычисление выглядит следующим образом (см https://stackoverflow.com/a/23193044/3088138 для более подробной информации)

dx = x2-x1; dy = y2-y1; 
dist2 = dx*dx + dy*dy; 
R = r1+r2; 

if (dist2 <= R*R) 
{ 
    dvx=vx2-vx1; dvy=vy2-vy1; 
    dot = dx*dvx + dy*dvy; 

    if (dot < 0) 
    { 
     factor = 2/(m1+m2)*dot/dist2; 
     vx1 += m2*factor*dx; 
     vy1 += m2*factor*dy; 
     vx2 -= m1*factor*dx; 
     vy2 -= m1*factor*dy; 
    } 
} 
Смежные вопросы