В одном из моих проектов у меня есть игровая площадка в форме круга. Внутри этого круга движется еще один маленький круг. Я хочу, чтобы маленький круг не выходил за пределы большего. Ниже вы можете видеть, что в кадре 2 маленький круг частично снаружи, мне нужен способ вернуть его назад, прежде чем он собирается выйти наружу. Как это может быть сделано?
Кроме того, мне нужна точка столкновения вдоль дуги большого круга, чтобы я мог обновить скорость малого круга. Как можно было бы рассчитать эту точку?
То, что я хотел бы сделать, это перед тем, как переместить маленький круг, я предсказываю его следующую позицию, и если он находится снаружи, я нахожу время столкновения между t = 0 и t = 1 (t = 1 шаг полного времени). Если у меня есть время столкновения t, то я просто перемещаю маленький круг в течение t вместо полного временного шага. Но опять же, проблема в том, что я не знаю, как обнаружить в это время столкновение, когда речь идет о двух кругах, и один находится внутри другого.
РЕДАКТИРОВАТЬ:
Пример точки столкновения (зеленый), которую я хочу найти. Может быть, картина немного не та, но вы поняли.
источник
B
, иk=0
. Теперь, если вы хотите разрешения коллизий , я не рассмотрел это в своем ответе, потому что это потребовало бы знания о физических свойствах объектов. Что должно произойти? Должен ли внутренний круг подпрыгивать внутри? Или катиться? Развертка?V
, продвигать внутренний кругV*t
по окружностиR-r
круга. Это означает вращение угловыхV*t/(R-r)
радианов вокруг точкиA
. И вектор скорости можно вращать таким же образом. Не нужно знать нормаль (которая всегда ориентирована на центр круга) или обновлять скорость любым другим способом.Скажем, большой круг - это круг А, а маленький круг - это круг Б.
Проверьте, находится ли B внутри A:
Если в кадре
n-1
B было внутри A, а в кадреn
B - вне A, и время между кадрами не было слишком большим (иначе B не двигалось слишком быстро), мы можем приблизить точку столкновения, просто найдя декартовы координаты B относительно к:Затем мы можем преобразовать эти точки в угол:
Если вы хотите более точно узнать, что
t
B находится за пределами A, то в первый раз вы можете выполнять пересечение окружности луча в каждом кадре, а затем сравнивать, если расстояние от B до точки столкновения больше, чем расстояние B, если оно текущая скорость. Если это так, вы можете рассчитать точное время столкновения.источник
Пусть (Xa, Ya) позиция большого круга и его радиус R, и (Xb, Yb) положение меньшего круга и его радиус r.
Вы можете проверить, сталкиваются ли эти два круга, если
Чтобы выяснить положение столкновения, найдите точный момент времени, когда круги сталкиваются, используя двоичный поиск, но с фиксированным числом шагов. В зависимости от того, как устроена ваша игра, вы можете оптимизировать эту часть кода (я предоставил это решение независимо от того, как ведет себя маленький шарик. Если он имеет постоянное ускорение или постоянную скорость, эту часть кода можно оптимизировать и заменить на простую формулу).
Как только вы знаете время столкновения, вычислите положения двух кругов в последний раз, и конечная точка столкновения
источник
Я реализовал демонстрацию отскока мяча по кругу на jsfiddle, используя алгоритм, описанный Сэмом Хочеваром :
http://jsfiddle.net/klenwell/3ZdXf/
Вот javascript, который определяет точку контакта:
источник