итак, соберем все в кучу. У нас есть тела, они занимают какое-то положение в мире. У них есть параметры - масса, инерция и тп. У тел есть оболочка, или коллайдеры, с помощью которых мы понимаем как они сталкиваются.
Всю эту систему мы обновляем раз в какой-то промежуток времени, обычно это 1/60 секунды. Сначала двигаем тела в соответствии с их скоростями. Затем смотрим кто с кем столкнулся - отсеиваем очевидные НЕ пересечения в широкой фазе и уточняем точки контакта в узкой фазе. После этого в несколько итераций считаем импульсы между парами тел. Повторяем на следующем кадре
Всю эту систему мы обновляем раз в какой-то промежуток времени, обычно это 1/60 секунды. Сначала двигаем тела в соответствии с их скоростями. Затем смотрим кто с кем столкнулся - отсеиваем очевидные НЕ пересечения в широкой фазе и уточняем точки контакта в узкой фазе. После этого в несколько итераций считаем импульсы между парами тел. Повторяем на следующем кадре
движимые тела и недвижимые. Есть ящик, который ведет себя динамически, а есть земля, которая статична. Ее подвинуть нельзя. По сути это просто типы твердых тел, что отражается в рассчете импульсов. К статическим телам не применяется импульс, весь импульс уходит в динамическое тело
ограничения или джоинты. Применяется в физике авто для подвески, например. Или для ragdoll (трупаки), для симуляции суставов тела. Задают какие-то органичения для двух тел, как они могут двигаться друг относительно друг друга. По сути, история точно такая же что и в контактах, но немного по-другому. Решается теми же численными методами внутри солвера
Собственно, все это было придумано в начале 2000х, и по сути нифига не поменялось. Физдвижки уже пршли стадию борьбы и устаканились. Все юзают PhysX для трехмерной физики, и Box2D для 2D. Мир физики затух и не развивается, что меня печалит. Потому что я правда считаю что эта зона может дать сильный толчок в развитии картинки в игре, как бы странно это ни звучало
иии здесь на сцену выходят снова численные метолы (полезная штука, да?). В это раз мой герой это Томас Якобсен, работавший над физикой первого Hitman. О дааа, бородатые года, а можно было таскать гибкие трупаки по локации, растения огибали персонажа, шторы вели себя физично, и галстук (карл!) физично болтался на груди 47го. Такого и нынче то не часто встретишь
Вот его оригинальная статья про физику в хитмане
Вот его оригинальная статья про физику в хитмане
ориентация тел в пространстве, их вращение осуществляется через линейные движения вершин. По сути они крутятся друг от друга, удерживаются между собой связями.
самый интересный момент - это связи. Как их решать? Попробуем снова пойти от наивного решения проблемы, представим что это просто пружины. Но пружины пружинят, и тело из пружин скорее похоже на желе. А если сделать их очень твердыми пружинами? Тогда в рассчете получаются огромные скорости которые при интегрировании 1/60 секунды превращаются в огромные расстояния, и тела взрываются
самый интересный момент - это связи. Как их решать? Попробуем снова пойти от наивного решения проблемы, представим что это просто пружины. Но пружины пружинят, и тело из пружин скорее похоже на желе. А если сделать их очень твердыми пружинами? Тогда в рассчете получаются огромные скорости которые при интегрировании 1/60 секунды превращаются в огромные расстояния, и тела взрываются
Окей, есть еще второй подход, физика мягких тел, если вы еще не забыли. Мне лично он нравится даже больше чем физика твердых тел, потому что он просто прикольнее и в какой-то мере изящнее
где он применяется? Для всяких тканей или деформируемых тел. Например beamng - это физика магких тел. Выглядит круто и сложно, но на самом деле это все ппц просто до усрачки
где он применяется? Для всяких тканей или деформируемых тел. Например beamng - это физика магких тел. Выглядит круто и сложно, но на самом деле это все ппц просто до усрачки
Немного поподробнее про сами частицы. В версии Томаса используется интеграция Верле. В таком подходе у частиц нет скорости, вместо этого хранится предыдущая позиция на прошлом кадре. Следующая позиция на новом кадре рассчитывается как текущая позиция + дельта от предыдущей. Предыдущая перезаписывается. Таким образом каждая вершина представлена 2мя векторами - текущая и предыдущая позиции.
Здесь солвер обновляет текущие позиции вершин, что обновляет дельту от предыдущей позиции, и фактически влияет на скорость и направление движения. В сумме вся эта система работает так, что тела движутся довольно правдоподобно. Но, честно говоря, это нечестные расчеты, они не соответствуют реальности.
Трение и взаимопроникновения решаются просто сдвигом точки в нужном направлении. К сожалению, это дает порой плохие результаты, при сильном проникновении тела могут вылетать друг из друга с невероятно большой скоростью. В отличие от физики твердного тела это не так плохо выглядит, тк большая скорость "проникшей" точки уравновешивается другими точками, которые находятся снаружи
Здесь солвер обновляет текущие позиции вершин, что обновляет дельту от предыдущей позиции, и фактически влияет на скорость и направление движения. В сумме вся эта система работает так, что тела движутся довольно правдоподобно. Но, честно говоря, это нечестные расчеты, они не соответствуют реальности.
Трение и взаимопроникновения решаются просто сдвигом точки в нужном направлении. К сожалению, это дает порой плохие результаты, при сильном проникновении тела могут вылетать друг из друга с невероятно большой скоростью. В отличие от физики твердного тела это не так плохо выглядит, тк большая скорость "проникшей" точки уравновешивается другими точками, которые находятся снаружи
Что ж, подход удивительно похож на солвер их физики тведых тел - решаем систему связей не один раз, а раз 6-8 за кадр. Однако, тут все гораздо проще. Томас представил систему связей как систему бесконечно упругих пружин. И пришел к выводу, что с такими пружинами, две частицы мгновенно приходят в стабильное состояние и расстояние между ними равно целевому. Повторить 8 раз. Все.
Это безумно простая идея, безумно простой код, дающие огромнй потенциал для реализации всяких штук
Это безумно простая идея, безумно простой код, дающие огромнй потенциал для реализации всяких штук
здесь чуть сложнее проверка столкновений, тк сложно описать гибкое тело негибкой формой. Для кубов еще можно использовать примитивы, но для тряпок уже не получится. Здесь отлично ложится подход разбиения на сферы. Обычно можно каждую точку описать сферой и проверка столкновений выглядит весьма правдоподобной
Физика твердого тела - наиболее распространенный вид физики в играх. Это всякие ящики, машины, регдоллы и др. Можно делать разрушаемые или гибкие тела с помощью джоинтов. Пример с besiege выше - это физика твердого тела. Просто тел много, они маленькие и соединены множеством джоинтов. Джоинты могут разрушаться при достижении определенного порога импульса
итак, отличие от физики твердых тел в том, что физическое тело не описыается единой матрицей трансформации и оболочкой. Тело описывается набором точек и связей между ними. Например квадрат - это 4 точки и 2 треугольника. Каждая точка ведет себя как отдельное упрощенное твердое тело - у нее есть позиция, скорость, масса. Но нет вращения. Точки соединены связами, или балками (beam -> beam.ng). Цель связей проста - сохранять расстояние между точками. Ну или вести себя как пружина, или как эластичная связь - сокращаться под действием силы
В общем, все тела они похожи на такие балочные конструкции, а-ля металлические мосты из треугольнико или эйфелева башня. Три точки, соединенные связями в треугольник образуют твердое тело - треугольник нельзя сжать или деформировать при абсолютно упругих связях. Из треугольников можно делать жесткие формы, например квадрат - это 2 треугольник. А так же и деформируемые - тряпки, джоинты и тп.
в остальном это очень похоже на физику твердых тел:
- интегрируем положения точек
- ищем столкновения
- решаем ограничения связей
- применяем силы
- повторяем
В общем, все тела они похожи на такие балочные конструкции, а-ля металлические мосты из треугольнико или эйфелева башня. Три точки, соединенные связями в треугольник образуют твердое тело - треугольник нельзя сжать или деформировать при абсолютно упругих связях. Из треугольников можно делать жесткие формы, например квадрат - это 2 треугольник. А так же и деформируемые - тряпки, джоинты и тп.
в остальном это очень похоже на физику твердых тел:
- интегрируем положения точек
- ищем столкновения
- решаем ограничения связей
- применяем силы
- повторяем
Вот и разобрали оба подхода в физике. В реальности эти оба подхода комбинируются в одном движке, частицы мягких тел могут влиять на твердые тела посредством импульсов и наоборот. В итоге мы может делать весьма интересные комбинации
Но над всеми этими подходами есть одна существенная проблема - это точность расчетов. Да, методы позволили значительно ускорить и уточнить рассчеты. Однако, для сложной физики этого недостаточно. Сложно сделать маленькие и сложные механизмы. Нельзя, например, сделать полностью физичный автомат со всеми механизмами внутри. Ну, по правде говоря, наверное для одного автомата на сцене можно посчитать, со значительными упрощениями и уменьшением шага времени. По сути шаг времени уточняет физику, однако пропорционально отъедает ресурсы.
тем не менее даже для физики авто в продвинутых моделях используются отдельные системы, которые гораздо точнее в рассчетах. В том же beam.ng при больших скоростях или крупных планах видно что физика дрожит, металл становится более резиновым, а поведение авто на дороге отличается от реального
тем не менее даже для физики авто в продвинутых моделях используются отдельные системы, которые гораздо точнее в рассчетах. В том же beam.ng при больших скоростях или крупных планах видно что физика дрожит, металл становится более резиновым, а поведение авто на дороге отличается от реального
На мой взгляд здесь может быть следующий виток развития физики в играх. Ведь кроме игровой физики существует и более точная физика, применяемая для рассчета целых зданий или для симуляций поведения материалов и тд. Там используются похожие методы, но там не делаются допущения в угоду производительности, от чего точность выше и ей можно доверять. Однако, это в разы, сотни раз тяжелее в плане производительности
И, как в примере комбинации физики твердых и мягких тел, почему бы не скомбинировать подходы точных и "игровых" расчетов. Мощности стали выше, и даже точные методы можно достаточно быстро посчитать.
Например, взять кузов автомобиля и систему рычагов подвески, и посчитать честным подходом. А весь "навес", типа кузовных панелей сделать по упрощенному подходу, с физикой мягких тел в играх. В итоге мы получим более точную модель поведения на дороге, при этом достаточно правдоподобные поврежения
И, как в примере комбинации физики твердых и мягких тел, почему бы не скомбинировать подходы точных и "игровых" расчетов. Мощности стали выше, и даже точные методы можно достаточно быстро посчитать.
Например, взять кузов автомобиля и систему рычагов подвески, и посчитать честным подходом. А весь "навес", типа кузовных панелей сделать по упрощенному подходу, с физикой мягких тел в играх. В итоге мы получим более точную модель поведения на дороге, при этом достаточно правдоподобные поврежения
Ну и уже готовые подходы мало используются. С помощью физики мягких тел можно симулировать мускулатуру, кожу и жир, придавая лицам и телам более правдоподобное поведение. Деревья можно сделать гибкими, разрушения более реалистичными. Не обязательно всю сцену симулировать, а только то что находится в ближайшей видимости, этого хватит чтобы обмануть глаз зрителя и поднять качество картинки на кновый уровень
Моя мечта - попробовать реализовать все эти детали в игре или движке, чтобы сделать убер-песочницу, где все можно ломать-строить и экспериментировать
Моя мечта - попробовать реализовать все эти детали в игре или движке, чтобы сделать убер-песочницу, где все можно ломать-строить и экспериментировать
Теперь немного при физику самолета и авто. Начнем с самолета.
В голову сразу лезут страшные мысли об аэродинамике, потоках воздуха, форме крыла и сложных формулах... Но вот эту демку в видео я сделал в бородатые годы буквально за неделю, и принципы там довольно простые. Однако, она вполне тянет на некую ступень симуляторной, уж явно не аркадной. Самолет ускоряется и замедляется там где должен, при сильном падении скорости падает в штопор, работают все нужные способы управления.
Итак, попробуем подумать как можно реализовать физику самолета. первая мысль - сложная, пытаться эмулировать потоки воздуха. Это в целом возможно, но крайне сложно и затратно по производительности. Нужно построить трехмерный куб вокруг самолета, разбитый на много ячеек, и считать поток воздуха в каждой отдельной ячейке. Если в ячейку попадает какая-то часть самолета, учитывать ее влияние. Далее, потоки воздуха влияют на те же части (ветер дует - давит на эту часть в секторе), силы суммируются, и вауля - самолет летит.
Но это довольно сложно реализовать по всем фронтам - нужно разбираться с физикой воздуха, бить на сектора, понимать какая часть самолета в каком кубе и тд. При этом секторов будет овердофига, тк мы в 3х измерениях. Если разбить на 1000 по высоте/ширине/длине, то получается миллиард ячеек. Поди посчитай их 60 раз в секунду, для одного самолета. А их может быть несколько... В общем это зубодробильный подход и вряд ли он применим в играх (разве что во flight simulator)
В голову сразу лезут страшные мысли об аэродинамике, потоках воздуха, форме крыла и сложных формулах... Но вот эту демку в видео я сделал в бородатые годы буквально за неделю, и принципы там довольно простые. Однако, она вполне тянет на некую ступень симуляторной, уж явно не аркадной. Самолет ускоряется и замедляется там где должен, при сильном падении скорости падает в штопор, работают все нужные способы управления.
Итак, попробуем подумать как можно реализовать физику самолета. первая мысль - сложная, пытаться эмулировать потоки воздуха. Это в целом возможно, но крайне сложно и затратно по производительности. Нужно построить трехмерный куб вокруг самолета, разбитый на много ячеек, и считать поток воздуха в каждой отдельной ячейке. Если в ячейку попадает какая-то часть самолета, учитывать ее влияние. Далее, потоки воздуха влияют на те же части (ветер дует - давит на эту часть в секторе), силы суммируются, и вауля - самолет летит.
Но это довольно сложно реализовать по всем фронтам - нужно разбираться с физикой воздуха, бить на сектора, понимать какая часть самолета в каком кубе и тд. При этом секторов будет овердофига, тк мы в 3х измерениях. Если разбить на 1000 по высоте/ширине/длине, то получается миллиард ячеек. Поди посчитай их 60 раз в секунду, для одного самолета. А их может быть несколько... В общем это зубодробильный подход и вряд ли он применим в играх (разве что во flight simulator)
YouTube
fly
Попробуем упростить и декомпозировать задачу. Разобьем самолет на куски:
- винт впереди, он тупо тянет
- фюзеляж
- крылья
- хвост
- всякие элероны, закрылки и тп, в общем всякие управляющие штуки
И попробуем применить вышеописанную симуляцию для каждой отдельной части в предрассчитанном виде. То есть, можно задать определенные графики зависимости скорости воздуха относительно каждой оси объекта (XYZ), к силе, которая оказывает влияние на эту часть. Какие это графики будут?
Возьмем за пример крыло. Попробуем представить какие это графики были бы. Еще раз - по каждой оси строим график силы от скорости воздуха вдоль оси. Ось X располагается вдоль крыла, ось Z перпендикулярно в плоскости крыла "вперед", ось Y перпендикулярна крылу и направлена вверх.
- по оси X: ветер почти не влияет на крыло, сила маленькая
- по оси Y: ветер влияет сильно, чем сильнее ветер, тем сильнее сила. Вероятно график не лениейны
- по оси Z: как и по оси X почти не влияет
- винт впереди, он тупо тянет
- фюзеляж
- крылья
- хвост
- всякие элероны, закрылки и тп, в общем всякие управляющие штуки
И попробуем применить вышеописанную симуляцию для каждой отдельной части в предрассчитанном виде. То есть, можно задать определенные графики зависимости скорости воздуха относительно каждой оси объекта (XYZ), к силе, которая оказывает влияние на эту часть. Какие это графики будут?
Возьмем за пример крыло. Попробуем представить какие это графики были бы. Еще раз - по каждой оси строим график силы от скорости воздуха вдоль оси. Ось X располагается вдоль крыла, ось Z перпендикулярно в плоскости крыла "вперед", ось Y перпендикулярна крылу и направлена вверх.
- по оси X: ветер почти не влияет на крыло, сила маленькая
- по оси Y: ветер влияет сильно, чем сильнее ветер, тем сильнее сила. Вероятно график не лениейны
- по оси Z: как и по оси X почти не влияет