Мяч попадает в угол, где он будет отклоняться?

46

Мне нужно освежить мою тригонометрию и надеюсь, что вы можете помочь здесь с простой математической моделью. Здесь моя модель пока что на картинке прилагается. Я знаю, что у анимации кадров есть другие проблемы, когда шар движется очень быстро, но сейчас мне просто нужно вычислить ballDx и ballDy. Также возможно, что ballDx = 0 (только вертикальное движение), но когда шар отклоняется, ballDx может получить другое значение.

Двухмерное столкновение между шаром и угловым краем твердого неподвижного объекта

Lumis
источник
22
Это то, что они называют «угловым делом»?
Эндрю Гримм
2
Определенно, по ходу дела скоро мы можем использовать теорию относительности для ее решения - проблема становится массовой (Ive).
Лумис

Ответы:

45

Примечание: Все нижеприведенное предполагает, что поверхность шара не имеет трения (поэтому он не начнет вращаться или отскакивать по-другому, потому что это так).

В момент столкновения мяч будет касаться угла. Когда твердые объекты сталкиваются, сила действует на так называемую нормаль поверхности, то есть перпендикулярно поверхности в точке столкновения.

Поскольку это шар, перпендикулярно поверхности к центру шара. Итак, мы знаем направление силы, как насчет ее величины? Предполагая упругое столкновение (и то, что прямоугольник не может двигаться), шар должен отскочить с той же скоростью, с которой он воздействовал.

Пусть (nDx, nDy) - скорость после столкновения, (oDx, oDy) - скорость до столкновения и (x, y) - положение шара в точке столкновения. Далее предположим, что угол, с которым сталкивается шар, находится в точке (0,0).

Выражая наши идеи в виде формул, мы имеем:

(nDx, nDy) = (oDx, oDy) + c * (x, y)
length (nDx, nDy) = length (oDx, oDy)

Что эквивалентно:

nDx = oDx + c * x
nDy = oDy + c * y
nDx^2 + nDy^2 = oDx^2 + oDy^2

Подставляя первые два уравнения в последнее, получим:

(oDx + c * x)^2 + (oDy + c * y)^2 = oDx^2 + oDy^2

Расширение с использованием биномиального тора

(a+b)^2 = a^2 + 2ab + b^2 

выходы:

oDx^2 + 2 * oDx * c * x + (c * x) ^ 2 + oDy^2 + 2 * oDy * c * y + (c * y) ^ 2 = oDx^2 + oDy^2
2 * oDx * c * x + 2 * oDy * c * y + (c * x) ^ 2 + (c * y) ^ 2 = 0
(2 * oDx * x + 2 * oDy * y) * c + (x^2 + y^2) * c^2 = 0

Это квадратное уравнение для cимеет два решения, одно из которых равно 0. Очевидно, что это не то решение, которое нас интересует, так как обычно направление шара изменится в результате столкновения. Чтобы получить другое решение, мы делим обе стороны на c и получаем:

(2 * oDx * x + 2 * oDy * y) + (x^2 + y^2) * c = 0

Это:

 c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)

Подводя итог, мы имеем:

c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)
nDx = oDx + c * x
nDy = oDy + c * y

Редактировать : В коде:

if (collision) {
    float x = ballX - cornerX;
    float y = ballY - cornerY;
    float c = -2 * (ballDx * x + ballDy * y) / (x * x + y * y);
    ballDx = ballDx + c * x;
    ballDy = ballDy + c * y;
}

Несколько соображений по реализации: Хотя вы можете приблизить (x, y) положение шара после шага симуляции, это приближение изменит угол отклонения и, следовательно, будет очень заметным, поэтому ваши шаги симуляции должны быть очень хорошими (возможно, такими, чтобы мяч не перемещается более чем на 1/20 своего диаметра за шаг). Для более точного решения вы можете вычислить время, когда происходит столкновение, и разделить этот шаг моделирования в это время, то есть сделать частичный шаг до точки столкновения и еще один частичный шаг для оставшейся части шага.

Редактировать 2: Вычисление точки удара

Пусть r - радиус, (x0, y0) положение и (dx, dy) скорость шара в начале шага моделирования. Для простоты давайте далее предположим, что рассматриваемый угол расположен в точке (0,0).

Мы знаем:

(x,y) = (x0, y0) + (dx, dy) * t

Мы хотим

length(x,y) = r

Это

(x0 + dx * t) ^ 2 + (y0 + dy * t) ^ 2 = r^2
x0^2 + 2 * x0 * dx * t + dx^2 * t^2 + y0^2 + 2 * y0 * dy * t + dy^2 * t^2 = r ^ 2
(dx^2 + dy^2) * t^2 + (2 * x0 * dx + 2 * y0 * dy) * t + (x0^2 + y0^2 - r^2) = 0
\____  _____/         \____________  ___________/       \_______  ________/
     \/                            \/                           \/
     a                             b                            c

Это квадратное уравнение в т. Если его дискриминант

D = b^2 - 4 * a * c

отрицательно, у него нет решений, то есть мяч никогда не достигнет угла на своем текущем курсе. В противном случае два его решения определяются

t1 = (-b - sqrt(D)) / (2 * a)
t2 = (-b + sqrt(D)) / (2 * a)

Нас интересует время начала столкновения, которое является более ранним временем t1.

Ваш метод станет:

    // compute a,b,c and D as given above

    if (D >= 0) {
        t = (-b - sqrt(D)) / (2 * a);
        if (0 < t && t <= ts) {
            // collision during this timestep!

            x = x + t * dx;
            y = y + t * dy;
            ts = ts - t;

            // change dx and dy using the deflection formula 
        }
    }

    x = x + ts * dx;
    y = y + ts * dy;
меритон - забастовка
источник
1
это заслуживает +1
динамический
1
Не стесняйтесь, голосуйте, а затем :-)
меритон - бастует 10
3
Вы говорите это очень рано, At the moment of collision, the ball will be touching the cornerно я не вижу оправдания этому приближению (и это должно быть приближение, потому что это неправда - мяч касается в двух местах, ни один из которых не является углом).
Питер Тейлор
1
@Peter Taylor: Вы заметили, что ОП нарисовал мяч за пределами прямоугольника, и формула обнаружения столкновений, приведенная в вопросе, также предполагает это? Вы должны думать нестандартно здесь :-)
меритон - забастовка
1
Мне нравится этот ответ, но он может использовать некоторую разметку математики $ \ LaTeX $.
Мартин Уикман,
13

Вот визуальный взгляд на проблему.

Исходный набор проблем - круг против прямоугольника (серый на рисунке ниже). Это эквивалентно точке против прямоугольника с закругленными углами (показано черным цветом).

Так что это проблема из нескольких частей. Вы проверяете свое столкновение точек против 4 линий (вытянутых из края рамки радиусом исходного круга) и 4 кругов (по углам прямоугольника с таким же радиусом исходного круга).

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

введите описание изображения здесь

Я оставлю вывод этого в качестве упражнения для читателя.

тетрада
источник
2

Я работаю над игрой и тоже застрял здесь. Но я думаю, что это происходит так:

введите описание изображения здесь

Есть еще одна точка зрения. Моя проблема в том, что я не знаю, как быстро вычислить новый dx, dy (для меня использование традиционной математики требует слишком большого количества вычислений).

Риса
источник
Моя точка зрения отличается от той, что во 2-м звене, потому что я не думаю, что новый вектор скорости зависит от центра блока, подобного этому. Мой брат сказал мне, что мяч отскочит назад в старом направлении (dx = -dx && dy = - dy), но я так не думаю.
Risa
Если мяч попадает в угол и расстояние мячаX от угла X меньше 1/4 от ballW, он отскакивает назад, в противном случае он отклонится вперед вправо. Это простая модель, которую я использую в данный момент, которая не очень точно настроена, чтобы найти точный угол.
Лумис
0

Кинематика - все о выборе правильной, как в наиболее удобной для расчетов, системы отсчета.

Здесь мы сначала определим преобразование T, которое разрешает наши оси в компоненты, параллельные ( x ' ) и перпендикулярные ( y' ) к линии между центром шара и углом. Обратное преобразование T * восстановит нашу исходную систему координат.

В этой новой системе отсчета, отражением (и временной и пространственной симметрией физики), мы имеем преобразование скорости контакта M ( точечный импульс ) как то, которое обращает компоненту x ' и оставляет неизменной компоненту y' . В матричных терминах это диагональная матрица с -1 и 1 на диагонали.

Тогда скорость после столкновения просто: V ' = T * . M . T . Во .

Время удара т затем только раствор для ( T . Do ) + ( Х . Т . Во- ) ( т ) = г , где Х является оператором проекции оси Х и г представляет собой радиус шара. Переставленные, получим
т = ( г - ( т . Do )) / (( Х . Т . Во- ) ( т ))

В этом есть явное преимущество, заключающееся в том, что вся сложная математика находится в тщательно написанных, протестированных и отлаженных стандартных графических библиотеках. Это решение также идентично для 2D и 3D ситуаций - просто переключите графическую библиотеку. Наконец, это подчеркивает, что нужно сначала подумать о соответствующих системах отсчета, прежде чем решать какие-либо физические проблемы. Всегда есть искушение NIH, но на самом деле это просто рецепт ошибок, когда доступно более сжатое решение.

Питер Гиркенс
источник