Как заранее рассчитать траектории в игре в бильярд (пул)? - PullRequest
2 голосов
/ 15 декабря 2009

Большинство алгоритмов обнаружения столкновений в бильярде используют наивный подход, где позиции шаров увеличиваются, а затем проверяются на столкновения. Этот метод не работает хорошо, когда скорость действительно высока, потому что мы можем «пропустить» столкновения.

Я искал способ предварительно рассчитать траектории шаров в бильярдной игре. Как только траектории известны, я могу анимировать шары, пока они не перестанут двигаться. И мне не нужно беспокоиться о скорости, потому что столкновения математически обнаруживаются и разрешаются.

Знаете ли вы, кто-нибудь сделал это? Я не хочу изобретать велосипед. Спасибо.

Ответы [ 4 ]

1 голос
/ 10 мая 2010

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

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

1 голос
/ 15 декабря 2009

Начните с дерева квадрантов и уменьшите интервал выборки. Если ваши бильярдные шары движутся так быстро, что проходят через другие шары, вы неправильно моделируете игру. Вы когда-нибудь играли в игру в бильярд, где шары ДЕЙСТВИТЕЛЬНО двигались так быстро?

С другой стороны

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

1 голос
/ 15 декабря 2009

Одним из решений, которое я реализовал для чего-то подобного, является использование переменных временных шагов.

Реализация выглядит примерно так: у вас есть параметризованный по времени метод для определения положения мяча (в текущее время T плюс переменное время V); по умолчанию указывается значение V, равное 1,0. При расчете обновленной позиции вы можете выполнять обнаружение столкновений; естественный артефакт обнаружения столкновений является дробным показателем того, когда происходит столкновение. Если это произойдет, сбросьте свои позиции для текущей итерации и повторите все ходы с дробным V, затем выполните итерацию на сумму 1,0 - V.

Это работает на удивление хорошо и имеет то преимущество, что является относительно простой реализацией. Вызывает беспокойство тот факт, что вам требуется достаточная мощность процессора, чтобы можно было рассчитывать перемещения потенциально много раз в течение «естественного» временного интервала (то есть один кадр дисплея и т. Д.). Однако, поскольку этот тип вычислений довольно прост для современных процессоров, это не должно быть проблемой.

1 голос
/ 15 декабря 2009

Самый простой способ - просто использовать «наивный» подход с очень мелким шагом, но пока не оживлять шары.

...