2009-12-22 2 views
3

Я пытаюсь написать 2D-симуляцию шара, который отскакивает от неподвижных вертикальных и горизонтальных стен. Моделирование столкновений с гранями стен было довольно простым - просто отрицайте скорость X для вертикальной стены или Y-скорость для горизонтальной стены. Проблема в том, что шар также может сталкиваться с углами стен, где горизонтальная стена встречается с вертикальной стеной. Я уже понял, как обнаружить, когда происходит столкновение с углом. Мой вопрос в том, как мяч должен реагировать на это столкновение - то есть, как изменится его скорости X и Y в результате.2D Ball Collisions с углами

Вот список того, что я уже знаю, или знаю, как найти:

  • Х и Y координаты центра шара в течение кадра, когда столкновение обнаружено
  • Компоненты X и Y из скорость шара
  • координаты X и Y по углу
  • угол между центром шара и углу
  • угол, в котором мяч движется непосредственно перед столкновением
  • Сумма, которую шарик перекрывает угол, когда столкновение обнаружено

Я предполагаю, что это лучше делать вид, что угол бесконечно малый круг, так что я могу лечить столкновение между шариком и этот круг, как если бы мяч сталкивался со стеной, которая касается касательной к кругам в точке столкновения. Мне кажется, что все, что мне нужно сделать, это повернуть систему координат, чтобы выровняться с этой воображаемой стеной, перевернуть X-составляющую скорости шара в этой системе и повернуть координаты обратно в исходную систему. Проблема в том, что я понятия не имею, как программировать это.

Кстати, это идеальное моделирование. Я не воспринимаю ничего, как трение или вращение мяча. Я использую Objective-C, но мне действительно нужен общий алгоритм или какой-то совет.

ответ

3

Как вы говорите, вы можете рассматривать угол как круг с бесконечно малым радиусом. Нормаль столкновения самолета в этом случае задается единичным вектором от точки контакта в центре шара:

float nx = ballX - cornerX; 
float ny = ballY - cornerY; 
const float length = sqrt(nx * nx + ny * ny); 
nx /= length; 
ny /= length; 

для отражения вектора скорости вы это сделать:

const float projection = velocityX * nx + velocityY * ny; 
velocityX = velocityX - 2 * projection * nx; 
velocityY = velocityY - 2 * projection * ny; 
2

Если это резкий прямоугольный угол, он будет действовать как retrorefector и отскочить назад по пути, в который он входил. (резким я имею в виду без филе)

Смежные вопросы