Это универсальная проблема с большинством библиотек физики. Если вы заглянете в Google для «глубины проникновения» (вместе с «физикой», я предлагаю, или вы можете найти что-то совершенно другое: D), вы обнаружите, что даже в этих библиотеках используются такие же трюки, как у вас.
Для этого есть два решения:
Дешевый - увеличить частоту обновления. Перемещайте объекты на 10 меньших шагов вместо одного большого, и у вас будет меньше проникновения, поэтому закрепление его смещением шара от стены будет менее заметным.
Дорогое - это непрерывное обнаружение столкновений. Существуют алгоритмы, которые могут сказать вам, что для движущегося и неподвижного объекта точный момент времени будет пересекаться. Чтобы найти некоторые из них, воспользуйтесь «развернутым пересечением прямоугольника сферы».
Затем вы можете обновиться следующим образом: мяч должен двигаться на 1,0 единицы. Проверьте на столкновение. Столкновение происходит после 0,25 единиц, поэтому переместите шар на 0,25 единиц, рассчитайте вектор отражения (чтобы мяч отскакивал от стены), повторите проверку столкновения с оставшимися 0,75 единицами (пока вы не узнаете окончательное положение мяча). Это позволяет полностью избежать проникновений, и даже если ваш мяч движется так быстро, что он обычно пропускает стену в одном обновлении, столкновение будет обнаружено.