Вы можете подумать, что поскольку ваши стены выровнены по осям координат, имеет смысл написать код специального случая (для вертикальной стены отрицание координаты скорости X; для горизонтальной стены отрицание координаты y скорости). Тем не менее, как только у вас получится хорошо работать с вертикальными и горизонтальными стенами, возможно, вы подумаете следующее: «А как насчет стен под произвольными углами?» Поэтому стоит подумать об общем случае с самого начала.
В общем случае предположим, что ваша ракета имеет скорость v и поражает стену с нормальной поверхностью n .
Разделить v на компоненты u перпендикулярно стене и w параллельно ей.
Где:
u = ( v · n / n · n ) n
w = v - u
Здесь v · n является точечным произведением векторов v и n . Смотрите ссылку для объяснения того, как его вычислить. Точечное произведение n · n соответствует квадрату длины вектора нормали; если вы всегда сохраняете свои нормали в виде векторов единиц , тогда n · n = 1 и вы можете опустить деление.
После отскока на компонент движения параллельно стене воздействует трение f , а на компонент, перпендикулярный стене, влияет упругость, которая может быть задана в виде коэффициент реституции r .
Таким образом, скорость после столкновения равна v ' = f w - r u . В elastic идеально упругом, без трения столкновении, v ′ = w - u ; то есть движение отражается относительно нормали в точке столкновения, как на диаграмме, приведенной в ответе Билла.
Этот подход также работает в трех измерениях.
(Очевидно, это очень упрощенное понятие подпрыгивания; оно не учитывает момент импульса или деформацию. Но для многих видов видеоигр такое упрощение вполне подходит.)