Как мне построить 2D физический движок? [закрыто]

20

Самыми продвинутыми играми, которые я создал, являются игра с 8 шарами, созданная на физическом движке Box2dFlashAS3, и платформенная игра с уровнями.

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

Пожалуйста, предложите методы и статьи для любой необходимой базы знаний.

Вишну
источник

Ответы:

16

В то время как я рекомендую против качения своего физического движка для чего - нибудь другого , чем опыт это делать (просто понять , что вы , вероятно , следуешь выбросить , когда вы сделали - это действительно трудно получить все edgecases и числовой предел / вопросы устойчивости выясняли , и ваше время может быть намного лучше использовано для участия в существующем движке), вот несколько ресурсов:

Уроки в бильярдном зале: быстрое и точное обнаружение столкновений между кругами или сферами обсуждает столкновение окружности / окружности и сферы / сферы.

В N Учебники замечательны для базового понимания Разделительной оси теоремы на основе выявления и реагирование.

Leander
источник
9

У Эрин Катто есть все лекции GDC о внедрении Box2D онлайн. Box2D также имеет простой код для чтения, по моему опыту.


источник
PDF-файлы действительно жесткие материалы. Но когда я читаю файлы cpp и h, как вы сказали, они «понятны». Спасибо.
Вишну
+1. Box2D также очень заботится о стабильности, что очень сложно, когда вы катаетесь самостоятельно.
Леандер
5

Вот как вы можете это сделать:

Приближенное движение

Каждому физическому объекту нужны эти векторы:

  • Положение : где находится объект.
  • Скорость : как меняется его положение.
  • Ускорение : как меняется его скорость.

Итак, интуитивно, вы должны делать такие вещи каждый кадр с каждым физическим объектом a:

a.speed    += a.acceleration
a.position += a.speed

Подводные камни : это известно как метод интеграции Эйлера . Это приближение лучше для небольших скоростей и ускорений и с небольшими временными шагами. В игре это обычно так. Но если объект движется очень быстро к тонкой стене или прямо к другому движущемуся объекту, он может пропустить столкновение с этим объектом, когда его положение увеличивается на достаточно большую величину, чтобы полностью пересечь его. Если у вас есть быстро движущиеся объекты, вам может потребоваться постоянное обнаружение столкновений, чтобы избежать этого.

коллизия

Столкновение может быть аппроксимировано такой последовательностью:

  1. Обнаружение : обнаружено, что два тела пересекаются.
  2. Разрешение : положение каждого тела изменяется, чтобы они больше не пересекались.
  3. Физика : скорость каждого тела изменяется с учетом импульса, трения и восстановления (бодрости).

Это называется дискретным обнаружением столкновений, как это происходит в отдельные моменты времени. Каждый шаг заслуживает внимания:

Шаг 1: обнаружение столкновений (вещи сталкиваются?)

Для двух кругов : просто убедитесь, что их центры больше, чем сумма их радиусов друг от друга.

Для двух прямоугольников : проверьте, находятся ли какие-либо их угловые координаты внутри другого прямоугольника.

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

Подводные камни : Есть действительно много других типов столкновений, которые вы можете рассмотреть. Некоторые из них действительно сложны: выпуклые многоугольники могут пересекаться несколько раз !

Шаг 2: Разрешение столкновений (Раздвигая их.)

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

В качестве примера рассмотрим столкновение окружность-окружность, когда одна из окружностей зафиксирована на месте. Вектор минимального смещения имеет то же направление, что и разница между их векторами средней точки. Его длина - это разница между суммой их радиусов и расстоянием между центрами.

Эта идея легко обобщается на другие формы.

Подводные камни : Если оба сталкивающихся объекта являются подвижными, вам, возможно, придется переместить оба из них на некоторую долю от общего расстояния, чтобы получить правдоподобное приближение их движения. Очевидно, им придется двигаться в разных направлениях.

Шаг 3: Физика столкновений (Другие изменения.)

Наиболее очевидная вещь, которая имеет место, состоит в том, что один или два объекта изменяют направление, то есть поворачивает вектор скорости. Это довольно легко реализовать.

Подводные камни : объекты могут быть эластичными , но они могут не быть , в этом случае общая энергия в системе уменьшается. Вам может понадобиться сопротивление из-за сопротивления воздуха. Трение (особенно статическое трение ), как известно, сложно реализовать .

Некоторые выводы

Имитация реальности экспоненциально сложнее, чем больше, если вы хотите имитировать. Вы попадаете в минное поле бесчисленных крайних случаев, невероятно сложных формул и постоянно растущих стопок исследовательских работ.

Если ваши потребности просты или вы хотите учиться, попробуйте.

Если ваши потребности сложны или вам не нравится математика, попросите физический движок замаскировать детали для вас. Box2D и Bullet довольно популярны в играх.

Анко
источник
4

Вероятно, самый полный ресурс стиля учебника:
http://www.wildbunny.co.uk/blog/2011/04/06/physics-engines-for-dummies/

См. Также связанные статьи из того же блога:
http: // www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/
http://www.wildbunny.co.uk/blog/2011/03/25/speculative-contacts-an- непрерывное столкновение двигателя подход части-1 /

Functastic
источник
1
Записи в блоге wildbunny великолепны. +1.
Коммунистическая утка