«Реалистичное» столкновение в понге - PullRequest
2 голосов
/ 06 сентября 2010

Я хочу написать понг на C # и XNA с трением и отскоком. Я попытался реализовать столкновение как , описанное Гарет Рис в предыдущем вопросе .

Вот основной алгоритм, который я использую для понга:

  1. Разделите сталкивающиеся объекты, чтобы они больше не сталкивались.
  2. Получить нормаль поверхности для реакции на столкновение.
  3. Рассчитайте новую скорость - вот моя проблема.

Вот код, который я сейчас использую для ответа на столкновение:

Vector2 normalizedVelocity = Velocity;
normalizedVelocity.Normalize();

Vector2 u = -Velocity * Vector2.Dot(normalizedVelocity, normal);
Vector2 w = Velocity - u;

Velocity = w - u;

Для целей тестирования я предполагаю отсутствие трения и идеальную эластичность. Этот фрагмент кода отлично работает для объекта, движущегося только в одном направлении, например ::

Velocity.X = 100;
Velocity.Y = 0;

или

Velocity.X = 0;
Velocity.Y = 100;

Но когда я тестирую с помощью движущегося по диагонали шара, например ::1010*

Velocity.X = 100;
Velocity.Y = 40;

Результирующая скорость не та, которую я предполагаю.

Ответы [ 2 ]

4 голосов
/ 06 сентября 2010

Я думаю, что вы хотите сделать

Velocity = Velocity + 2 * normal * Vector2.Dot(Velocity, normal);

(где normal - нормализованная нормальная поверхность, указывающая наружу поверхности, с которой сталкивается шар)

Вместо

Vector2 u = -Velocity * Vector2.Dot(normalizedVelocity, normal);
Vector2 w = Velocity - u;

Velocity = w - u;

начиная со скорости * Vector2.Dot (...) имеет тот же курс, что и скорость, но шары обычно меняют направление при подпрыгивании ...

Если вам также нужно трение, вам нужно смоделировать вращение шара, и формулы станут немного более сложными.

1 голос
/ 20 ноября 2011

При столкновении со стеной, окном и т. Д. Вы должны просто изменить значение x или y (изменить знак)

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