Казалось бы, простое столкновение мяча и линии? - PullRequest
1 голос
/ 01 июня 2011

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

Я пишу в Objective-C с XCode 4 в Mac OS 10.6.8

Ответы [ 3 ]

2 голосов
/ 01 июня 2011

Я думаю, вам нужен «нормальный» вектор «поверхности», с которой столкнулся шар, а затем соответственно «переверните» вектор «скорости» шара.

Для пояснения: «нормаль» линии - это перпендикулярный вектор линии единичной длины.Думайте об этом как: линия представляет плоскость, которая будет иметь нормальный вектор.

От макушки головы: пусть N будет нормализованным (единичной длиной) "нормальным" вектором линии, пусть vбудет вектором скорости мяча.

  1. Проецируйте v на N, используя произведение точек (p = v DOT N)

  2. Добавьте вектор2 * p * N к v (v = v + 2 * p * N)

Я думаю, что это должно сработать ...

Я бы также рекомендовалиспользуя физический движок, как уже указывалось.

0 голосов
/ 01 июня 2011

Простой способ сделать это (на мой взгляд):

  • Когда вы создаете линию, вычислите матрицу, которая повернет ее в горизонтальное положение, и вычислите обратную величину этой матрицы.
  • Когда мяч сталкивается с линией:
    1. вращение вектора скорости на матрицу вращения
    2. изменить знак компонента y
    3. вращать вектор скорости обратно пропорционально матрице вращения.

Матрица вращения задается как:

( cos A ,  sin A )
( -sin A , cos A )

Матрица обратного вращения задается как:

( cos A , -sin A )
( sin A ,  cos A )

где A - угол между линией и горизонталью.

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

0 голосов
/ 01 июня 2011

Рассматривали ли вы возможность задействовать один из нескольких двигателей, чтобы сделать грязную работу за вас? Cocos2D , Box2D и Бурундук - это три, которые приходят на ум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...