Обнаружение столкновений и подпрыгивание - PullRequest
1 голос
/ 03 января 2012

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

Сейчас у меня естьработает и точное обнаружение столкновений, но проблема заключается в создании физики.Физика проста сейчас, у объекта есть вектор для его направления и скорости, когда происходит столкновение, вектор инвертируется.

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

Может ли кто-нибудь мне помочь?

РЕДАКТИРОВАТЬ: Обнаружение выполняется путем разделения теоремы об оси, и я не поместил код, потому что все, что действительно происходит, - это цикл для проверки столкновений, когда обнаруживается, что векторы инвертированы.Как я уже сказал, фактическое обнаружение работает нормально, я думаю, что моя проблема в том, как сказал Сиббо, перемещая объекты, чтобы они больше не сталкивались.

Ответы [ 4 ]

1 голос
/ 03 января 2012

Я недавно написал физику для бильярдной игры для университетского проекта (поэтому, хотя это, возможно, не код, соответствующий отраслевым стандартам, он делает то, что должен); то, что мы в конечном итоге сделали, чтобы предотвратить бесконечные циклы расчета эффектов идентичного столкновения, заключалось в следующем: мы сохраняли все столкновения в java.util.List и всякий раз, когда вычислялось следующее столкновение, мы проверяли, участвуют ли оба объекта в столкновении были уже частью последнего столкновения, которое было рассчитано; в этом случае эта пара объектов была проигнорирована.

Это имеет свои плюсы и минусы: плюсом является то, что вы не вносите неточности, используя (минимальное) смещение, чтобы объекты больше не касались. Недостатком является то, что вы не можете иметь два столкновения между двумя одинаковыми объектами один за другим (например, вы не можете иметь [(ball_1, ball_2); (ball_1, ball_2); ...], вы можете иметь только что-то как [(ball_1, ball_2); (ball_1, table); (ball_1, ball_2); ...] в качестве списка столкновений).

1 голос
/ 03 января 2012

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

1 голос
/ 03 января 2012

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

0 голосов
/ 03 января 2012

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

...