Физическая задача в понге

У меня есть проблема, но я не знаю, как ее описать, поэтому я нарисовал ее.

Pong Physics Graphic

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

Почему это происходит? Потому что, когда я обнаруживаю коллизию, я меняю vx на -vx. Что мне делать в таком случае? Изменить также y ? Но как проверить, с какой стороны мяч попал в ракетку?

Может другие идеи?


person zarcel    schedule 02.04.2011    source источник


Ответы (5)


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

В противном случае мяч может застрять внутри ракетки, постоянно отрицая значение vx = -vx = vx = -vx в каждом кадре. Он не покинет весло до тех пор, пока его импульс y не переместит его достаточно далеко вверх или вниз, чтобы убежать.

person Jeff Linahan    schedule 02.04.2011
comment
Не могли бы вы немного объяснить мне? :› - person zarcel; 03.04.2011
comment
Вам нужно установить положение x мяча, когда вы обнаружите столкновение; изменения скорости недостаточно. Крайний левый пиксель мяча должен появиться справа от крайнего правого положения ракетки. - person Jeff Linahan; 03.04.2011
comment
в основном, когда вы обнаруживаете столкновение, мяч может либо касаться ракетки, либо фактически пересекать ее. поэтому ваш первый шаг должен заключаться не только в том, чтобы изменить скорость, но и подтолкнуть мяч вдоль нового вектора, пока он не пересечет ракетку. вам нужно сделать это в атомарном шаге, до того, как управление будет возвращено вашему обычному циклу движения мяча. - person Martin DeMello; 03.04.2011

Проблема может быть вызвана рядом факторов.

Примечательно, что если мяч может перемещаться более чем на один пиксель за «тик» или «кадр», он может пересечь ракетку на несколько пикселей к моменту обнаружения столкновения.

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

Вы можете поставить флаг «не сталкиваться какое-то время» на эту комбинацию весла и мяча, когда пересечение впервые обнаружено.

В качестве связанной с этим проблемы: если мяч движется достаточно быстро (особенно когда его x-компонент самый высокий, например, когда мяч движется почти полностью горизонтально, так что для его прохода остается наименьшая часть ракетки), может на самом деле не должно быть кадров, где мяч физически пересекает ракетку.

Все зависит от вашего кода, который мы не видим. Надеюсь, вышеизложенное должно дать вам некоторые идеи.

person Lightness Races in Orbit    schedule 02.04.2011
comment
Этот флаг не конфликтует какое-то время и может обрабатываться как простой конечный автомат. При обнаружении столкновения, если оно находится в нормальном состоянии, применить отскок, а также перейти в состояние столкновения. Находясь в состоянии столкновения, не применяйте никакого отскока — просто оставайтесь в состоянии столкновения, пока столкновение больше не будет обнаружено, а затем вернитесь в нормальное состояние. Эффект - отскоки могут повторяться только после хотя бы одного кадра без столкновений. - person Steve314; 03.04.2011
comment
@Steve314: +1 Да, я бы так поступил. - person Lightness Races in Orbit; 03.04.2011
comment
Теоретически мяч никогда не может дважды подряд удариться об одну и ту же ракетку/стену, верно? Таким образом, если вы сохраните последний объект, с которым он столкнулся, вы можете игнорировать последующие обращения к тому же объекту. - person André Paramés; 03.04.2011
comment
@André: Это еще один хороший подход, не слишком далекий от подхода Стива. - person Lightness Races in Orbit; 03.04.2011
comment
Одна критика моего подхода - его могут сбить с толку столкновения с двумя отдельными объектами в двух последовательных кадрах - например. летучая мышь, затем верхняя/нижняя стена. Чтобы справиться с этим, требуется более сложное состояние. Одна из возможностей — именно то, что описывает Андре. - person Steve314; 03.04.2011

Ваш потрясающий рисунок показывает мне, что вы не обнаруживаете вертикальное столкновение. Вы должны сделать то же самое, что и для координат x для координат y.

person rubenvb    schedule 02.04.2011
comment
На самом деле, я знаю. Я устанавливаю скорость на 0, когда обнаруживается столкновение, и в обоих случаях оно останавливается на чертеже. - person zarcel; 03.04.2011

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

person Kromster    schedule 02.04.2011

Решение, которое я нашел при создании pong, состояло в том, чтобы использовать vx = abs(vx) при обнаружении столкновения с левой ракеткой и vx = -abs(vx) при обнаружении столкновения с правой ракеткой. это гарантирует, что мяч отскакивает только один раз, исключая перемещение внутри ракетки, вызванное многократными отскоками.

person The cocatrice    schedule 13.08.2017