Физика Двигатель Spring Bug - PullRequest
0 голосов
/ 24 марта 2012

Итак, я работал над двумерным физическим движком, который поддерживает многоугольники и круги. Я использовал теорему о разделяющей оси для всех комбинаций столкновений, кроме круга-круга. Вот основной формат движка:

* ПРИМЕЧАНИЕ: НЕ АКТУАЛЬНЫЙ КОД

Продвижение всех тел.

for every body a
{
   Vector2 sum = Vector2.Zero;
   for every body b where b != a
   {
     sum += a.collides(b).MinimumTranslationVector;
   }
   a.Position += sum;
   a.velocity += sum;
}

Вот видео с моей проблемой: http://www.youtube.com/watch?v=kSZeuP4AiQ0&feature=youtu.be

Ошибка - эффект пружины, который виден в начале. Я ломал голову, пытаясь придумать проблему, и ничего не придумал. Может кто-нибудь сказать мне, в чем проблема?

1 Ответ

0 голосов
/ 25 марта 2012

Если я правильно читаю этот псевдокод, всякий раз, когда сталкиваются два тела, каждое из них претерпевает изменения в положении и скорости. Тем не менее, когда падающий ящик попадает в ящик для отдыха, вы хотите, чтобы ящик для отдыха оставался неподвижным.

  1. Я думаю, вы должны пересмотреть свою базовую физику столкновений. Реальные столкновения не работают так.
  2. Подумайте об уменьшении временного шага. В конце концов, реальные объекты являются эластичными, но «жесткие» объекты вибрируют слишком быстро, чтобы мы могли их видеть; резиновая стопка блоков выглядит как стопка жестких объектов в замедленном темпе, поэтому если вы ускорите их, они будут выглядеть более жесткими. Масштабное движение уже правильно.
  3. Если вы хотите, чтобы объекты были непроницаемыми, вы должны реализовать специальные правила для этого. Я не знаю, являются ли стены непроницаемыми, но это было бы хорошим началом.
...